2013-04-07 18 views
7

wyobrazić masz aplikację (pojedynczy proces) napisany w C#jak mogę ograniczyć wielkość pamięci dla procesu .net/mono

Domyślnie aplikacja jest przydzielenie ogromną pamięć wirtualną, o wiele bardziej niż potrzebuje (na przykład pamięć rezydentna wynosi około 10 MB, a pamięć wirtualna około kilku GB).

W Javie jest możliwe, aby skorzystać z opcji, aby ograniczyć to z java -mx128m

Jak mogę zrobić to samo dla aplikacji .NET/mono? A pytanie dodatkowe: czy możliwe jest wymuszenie/zmiana opcji GC tak, aby zawsze utrzymywać jak najmniejszy poziom wykorzystania pamięci (jak to tylko możliwe, a nie gdy systemowi zabraknie pamięci)

zasadniczo moim celem jest tworzenie aplikacji .NET z minimalny ślad pamięci

EDIT: w celu uczynienia go bardziej jasne wstawić ten scenariusz, biorąc pod uwagę, że niemal każda aplikacja .NET wydaje się mieć podobny problem:

uruchomić MonoDevelop, które to C# aplikacja pod mono - to zjada MB pamięci wirtualnej, a używa tylko 291 MB pamięci rezydentnej. Oznacza to, że aplikacja używa tylko mniej niż 300 MB pamięci, ale poprosiła o 1800 MB z nieznanego powodu. Jest to powód, który chciałbym odkryć, oraz sposób, w jaki można temu zapobiec.

Prawdopodobnie nie stanowi to problemu dla większości użytkowników, ale może być problematyczne dla aplikacji działających w klastrach, takich jak SGE, gdy zadanie jest ograniczone przez pamięć wirtualną.

+0

nie byłoby lepiej, aby dowiedzieć się, dlaczego *** * ** aplikacja alokuje tyle pamięci wirtualnej? Zamiast ustawić przełącznik, który głoduje dla pamięci? –

+0

nie zrozumiałeś tego pytania, a może nie zapytałem poprawnie. Nie chodzi o konkretną 1 aplikację, dotyczy to ogólnie wszystkich aplikacji .net. Java ma ten przełącznik, który ustawia limit pamięci wirtualnej, zmuszając go do użycia jako mniejszej ilości pamięci. Jest to przydatne w przypadku klastrów zaawansowanych, takich jak SGE, gdzie zadanie jest ograniczone przez pamięć wirtualną. Moje pytanie brzmi, czy istnieje podobna możliwość dla .Net, więc GC dostaje się w sytuacji, gdy kończy się pamięć wcześniej niż cały system robi – Petr

+0

@CodyGray aplikacja oczywiście przydziela tyle pamięci, ponieważ jest to naturalne dla .net, tylko ponieważ jest to naturalne dla każdego innego języka, który korzysta z garbage collectora - nie zwalnia pamięci, chyba że wymaga zwolnienia pamięci i alokuje dużo pamięci wirtualnej, przy użyciu tylko małej pamięci rezydentnej, prostych aplikacji "Hello world" w java może jeść nawet kilka GB pamięci operacyjnej - zależy to od konfiguracji interpretera - patrz http://stackoverflow.com/questions/561245/virtual-memory-usage-from-java-under-linux-to-much-memory -used – Petr

Odpowiedz

Powiązane problemy