O ile znalazłem, nie ma prostego sposobu na control the size of the heap aplikacji .Net przy użyciu CLR.
Łącze powyżej tylko połowa odpowiada na pytanie. Kiedy zbadałem ten sam problem, odpowiedź brzmi: "Sterty rosną, aby wykorzystać całą dostępną pamięć", jakby to był jedyny powód, dla którego chcesz kontrolować maksymalny rozmiar sterty.
Na środowiskach (zazwyczaj Java) serwerów, nie chcesz, aby źle zachowująca się aplikacja hogowała pamięć kosztem innych hostowanych aplikacji. Prostym rozwiązaniem jest ograniczenie ilości pamięci, z której aplikacja może korzystać w swoim sterty. Jest to możliwe dzięki argumentowi Java -Xmx, dzięki czemu możesz zagwarantować, że aplikacja nie użyje więcej niż to, co jest planowane, np. -Xmx256M.Ponieważ przydzielanie pamięci na stercie podczas inicjalizacji może spowolnić uruchamianie aplikacji, Java używa argumentu -Xms, aby zezwalać aplikacjom, które wykonują wiele zadań podczas inicjowania, aby rozpocząć z dużym blokiem sterty zamiast JVM, niezależnie od rozmiaru sterty, ponieważ idzie.
. CLR środowiska .Net nie ma tej zdolności. Podejrzewam, że tak jest, ponieważ CLR .Net nie jest maszyną wirtualną. CLR okazuje się być API (dość obszernym, mogę dodać), który służy jako adapter do rodzimych .dlls, które są podobne do podejścia bardziej przypominającego plik wykonywalny, jeśli chodzi o zarządzanie pamięcią.
Zadałem to pytanie dotyczące rozwoju SharePoint i usłyszałem, że można kontrolować heapsize za pomocą modułów IIS zwanych Web Apps, dzięki czemu można powiedzieć IIS, aby ograniczyć pamięć danej aplikacji internetowej. Zastanawiam się, czy to dlatego, że IIS ma niestandardowe procedury, które zastępują/zastępują new()/malloc()/etc, a tym samym mogą zapewnić ten typ kontroli aplikacjom klienckim. Oznacza to, że samodzielne aplikacje .Net nie mają szczęścia, chyba że chcesz napisać niestandardowego menedżera pamięci w C++ i utworzyć interfejs dla .Net
Dzięki - ciekawe informacje na temat hostingu CLR. Prawdopodobnie przesada dla tego, kim teraz jestem Diong - po prostu upewnię się, że nie jestem świnią pamięci. – serg10
Współdzielone środowiska serwerów, które obsługują wiele aplikacji, powinny zapewnić, że maksymalna pamięć przydzielona przez wszystkie aplikacje klienckie nie spowoduje przecięcia dostępnej pamięci. Nie chcesz, aby jedna niewłaściwie działająca aplikacja usuwała cały serwer, ponieważ alokuje całą dostępną pamięć. –
@Kelly, to jest to, co robią usługi IIS i SQL Server, ponieważ są hostami dla innych zarządzanych aplikacji i kontrolują ile pamięci mogą mieć hostowane aplikacje ... z drugiej strony niehostowana aplikacja .Net jest bezpłatna alokować tyle, ile ma aplikacja natywna, nie ma tam żadnej różnicy (dlatego w .net host apis musi być używany do kontrolowania ilości przydzielonej pamięci) –