Udostępnij przez


Kolekcje indukowane

W większości przypadków odśmiecacz może określić najlepszy moment na przeprowadzenie procesu i powinien działać 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, korzystając z metody GC.Collect, aby wymusić odzyskiwanie 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ć wartość wyliczenia do metody GCCollectionMode.Optimized, aby kolekcja odbywała się tylko wtedy, gdy będzie wydajna, o czym mowa 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 uruchomienie odzyskiwania pamięci. Jest to równoważne z wywołaniem przeciążenia funkcji GC.Collect(). 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 kolektorowi śmieci określenie, czy aktualny moment jest optymalny do zebrania 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 działające w tle lub blokujące

Można wywołać przeciążenie metody GC.Collect(Int32, GCCollectionMode, Boolean), aby określić, czy wywołane zbieranie jest blokujące, czy nie. Typ wykonywanej kolekcji zależy od kombinacji parametrów metody mode i blocking. 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 przeprowadzana tak szybko, jak to możliwe. Jeśli kolekcja w tle jest w toku, a generacja wynosi 0 lub 1, metoda Collect(Int32, GCCollectionMode, Boolean) natychmiast wyzwala blokującą operację zbierania i kończy się, gdy kolekcja zostanie zakończona. Jeśli kolekcja w tle jest w toku, a parametr generation ma wartość 2, metoda czeka na zakończenie kolekcji w tle, wyzwala blokującą kolekcję generacji 2, a następnie zwraca. Odbiór jest przeprowadzony 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ść. Kolekcję można przeprowadzić w zależności od stanu odśmiecacza 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.

Zobacz także