Wywołane kolekcje
W większości przypadków moduł odśmiecenia pamięci może określić najlepszy czas na wykonanie kolekcji i należy zezwolić na jego uruchamianie niezależnie. Występują rzadkie sytuacje, w których wymuszona kolekcja może poprawić wydajność aplikacji. W takich przypadkach można wywołać odzyskiwanie pamięci przy użyciu GC.Collect metody wymuszenia odzyskiwania pamięci.
GC.Collect Użyj metody, gdy w kodzie aplikacji występuje znaczne zmniejszenie ilości pamięci używanej w określonym punkcie. Jeśli na przykład aplikacja używa złożonego okna dialogowego z kilkoma kontrolkami, wywołanie Collect okna dialogowego po zamknięciu okna dialogowego może poprawić wydajność przez natychmiastowe odzyskanie pamięci używanej przez okno dialogowe. Upewnij się, że aplikacja nie generuje zbyt często odzyskiwania pamięci, ponieważ może to zmniejszyć wydajność, jeśli moduł odśmiecania pamięci próbuje odzyskać obiekty w nie optymalnych czasach. Możesz podać GCCollectionMode.Optimized wartość wyliczenia do Collect metody , aby zebrać tylko wtedy, gdy kolekcja będzie wydajna, zgodnie z opisem w następnej sekcji.
Tryb zbierania GC
Możesz użyć jednego z GC.Collect przeciążeń metody, które zawiera GCCollectionMode wartość, aby określić zachowanie dla wymuszonej kolekcji w następujący sposób.
GCCollectionMode Wartość |
opis |
---|---|
Default | Używa domyślnego ustawienia odzyskiwania pamięci dla uruchomionej wersji platformy .NET. |
Forced | Wymusza natychmiastowe odzyskiwanie pamięci. Jest to równoważne wywołaniu GC.Collect() przeciążenia. Powoduje to pełną blokadę kolekcji wszystkich pokoleń. Można również skompaktować stertę GCSettings.LargeObjectHeapCompactionMode dużych obiektów, ustawiając właściwość na GCLargeObjectHeapCompactionMode.CompactOnce wartość przed wymuszeniem natychmiastowego pełnego blokowania odzyskiwania pamięci. |
Optimized | Umożliwia modułowi odśmieceń pamięci określenie, czy bieżący czas jest optymalny do odzyskania obiektów. Moduł odśmiecania pamięci może określić, że kolekcja nie byłaby wystarczająco wydajna, aby była uzasadniona, w takim przypadku zostanie zwrócona bez odzyskiwania obiektów. |
Kolekcje w tle lub blokujące
Można wywołać GC.Collect(Int32, GCCollectionMode, Boolean) przeciążenie metody, aby określić, czy kolekcja indukowana blokuje, czy nie. Typ wykonywanej kolekcji zależy od kombinacji parametrów i blocking
metodymode
. mode
jest elementem członkowskim GCCollectionMode wyliczenia i blocking
jest wartością Boolean . W poniższej tabeli przedstawiono podsumowanie interakcji argumentów mode
i blocking
.
mode |
blocking = true |
blocking = false |
---|---|---|
Forced lub Default | Kolekcja blokująca jest wykonywana tak szybko, jak to możliwe. Jeśli kolekcja w tle jest w toku, a generowanie wynosi 0 lub 1, Collect(Int32, GCCollectionMode, Boolean) metoda natychmiast wyzwala blokującą kolekcję i zwraca wartość po zakończeniu kolekcji. Jeśli kolekcja w tle jest w toku, a generation parametr ma wartość 2, metoda czeka na zakończenie kolekcji w tle, wyzwala blokującą kolekcję generacji 2, a następnie zwraca wartość. |
Kolekcja jest wykonywana tak szybko, jak to możliwe. Metoda Collect(Int32, GCCollectionMode, Boolean) żąda kolekcji w tle, ale nie jest to gwarantowane. W zależności od okoliczności może być nadal wykonywana blokada kolekcji. Jeśli kolekcja w tle jest już w toku, metoda zwraca natychmiast. |
Optimized | Może zostać wykonana kolekcja blokująca w zależności od stanu modułu odśmiecenia pamięci i parametru generation . Moduł odśmiecający elementy bezużyteczne próbuje zapewnić optymalną wydajność. |
Można wykonać kolekcję w zależności od stanu modułu odśmiecenia pamięci. Metoda Collect(Int32, GCCollectionMode, Boolean) żąda kolekcji w tle, ale nie jest to gwarantowane. W zależności od okoliczności może być nadal wykonywana blokada kolekcji. Moduł odśmiecający elementy bezużyteczne próbuje zapewnić optymalną wydajność. Jeśli kolekcja w tle jest już w toku, metoda zwraca natychmiast. |