Przeczytałem, że przypinanie obiektów w zarządzanej sterty wpływa na wydajność GC w .NET, ponieważ GC nie może kompaktować pamięci, jeśli są przypięte obiekty "na drodze". Ale ponieważ stertę dużych obiektów nie zagęszcza się tak, nie powinno to dotyczyć obiektów w LOH. Czy są jakieś inne ukryte koszty przypięcia obiektu, który znajduje się w LOH? Czy mogę bezpiecznie przypinać obiekty w LOH bez pogarszania wydajności GC?Czy przypięcie obiektu w LOH wpływa na wydajność GC?
Odpowiedz
Cóż, tylko dlatego, że sterty dużych obiektów (LOH) nie są zbite, nie oznacza to, że nie są one gromadzone . The LOH is collected i przypinanie obiektu będzie miało wpływ na przyszłe przydziały.
Ponieważ obiekt jest przypięty, efektywnie zmniejsza ilość pamięci dostępnej w LOH (tak samo, jak w przypadku odniesienia). Gdy zostanie utworzone inne żądanie przydzielenia dużego obiektu, jeśli w LOH jest zbyt wiele odniesień przypiętych/wstrzymanych, można uruchomić problemy z przydzielaniem większej liczby dużych obiektów.
Po zaznaczeniu znacznika w części zbierania i usuwania znaczników CLR prawdopodobnie oznacza wszystkie odniesienia przypięte jako pierwiastki, więc prawdopodobnie nie ma wpływu podczas tej części kolekcji; Zachowałoby się to w ten sam sposób, gdyby ktoś zachowywał odniesienie do dużego obiektu.
Ponieważ deallokacja odbywa się w ten sam sposób na LOH (blok jest po prostu oznaczony jako dostępny), ta operacja również nie ma wpływu.
I wreszcie, ponieważ LOH nie jest skompaktowany, ta operacja nigdy nie ma miejsca na tej stercie podczas GC, więc nie ma to wpływu na to.
Podsumowując, alokacje na LOH mogą być oznaczone jako zdecydowanie za pomocą przypinania odnośników do obiektów na LOH, podczas gdy najprawdopodobniej nie są to zbiory na LOH.
Chociaż nie zapominajmy, że alokowanie i przechowywanie dużych bloków pamięci może mieć konsekwencje ogólnie dla systemów, komentarze te są ściśle dotyczące LOH.
- 1. Ile wyrażeń "jeśli" wpływa na wydajność?
- 2. z-index, jak wpływa to na wydajność?
- 3. Czy szyfrowanie RDS AWS z usługą KMS wpływa na wydajność?
- 4. Czy korzystanie z wirtualnego środowiska wpływa na wydajność aplikacji internetowej?
- 5. Hows czy duży dziennik transakcji wpływa na wydajność?
- 6. Czy umieszczenie bloku try-catch wpływa na wydajność?
- 7. Czy dodanie zbyt wielu detektorów zdarzeń wpływa na wydajność?
- 8. W jaki sposób klauzula IN wpływa na wydajność w Oracle?
- 9. Redis: W jaki sposób "mem_fragmentation_ratio" wpływa na wydajność?
- 10. W jakich sytuacjach zamrażanie obiektów WPF znacząco wpływa na wydajność?
- 11. Czy posiadanie wielu bibliotek dll w projekcie Windows Phone wpływa na wydajność?
- 12. Czy maksymalny limit właściwości konfiguracji MaxReceivedMessageSize w wcf wpływa na wydajność usługi?
- 13. Czy rozmiar pliku wojny wpływa w pewien sposób na wydajność aplikacji i/lub serwera aplikacji?
- 14. GC.Cellect na kupie tylko 2 i dużej bryły obiektu
- 15. Czy zmiana kolejności Java wpływa na System.currentTimeMillis()?
- 16. Czy ValueTypes powoduje GC?
- 17. . Usuwanie śmieci .NET - na co wpływa?
- 18. Dlaczego ograniczenie GC do 1 wątku zwiększa wydajność?
- 19. Rozległe wykorzystanie LOH powoduje znaczny problem z wydajnością.
- 20. Jakiekolwiek wady wydajności GC?
- 21. Jak poprawić wydajność wkładki obiektu Core Data na telefonie iPhone?
- 22. Zmiana stylu kodowania ze względu na wydajność GC Androida, jak daleko jest za daleko?
- 23. Czy ustawienie TCP_NODELAY wpływa na zachowanie obu końców gniazda?
- 24. Czy licencjonowana czcionka GPL wpływa na licencję mojej aplikacji?
- 25. Czy interfejs API timeBeginPeriod wpływa na zegar systemowy?
- 26. Czy rozmiar zbioru danych wpływa na algorytm uczenia maszynowego?
- 27. Czy clear() wpływa na liczbę pakietów std :: unordered_set?
- 28. Czy niepodpisane słowo kluczowe wpływa na wynik sizeof?
- 29. Czy wydajność string.replaceAll() cierpi na niezmienność łańcucha?
- 30. Używanie lambda zamiast obiektu funkcji, zła wydajność
Dzięki za odpowiedź. Nie jestem pewien, czy otrzymam drugi akapit: dlaczego przypinanie zmniejsza ilość dostępnej pamięci bardziej niż zachowanie odniesienia? Zawsze jednak przypisywanie czegoś do LOH zasadniczo oznaczało szukanie wolnego bloku pamięci lub przydzielenie nowego segmentu - jeśli tak, każdy blok live powinien być traktowany tak samo, przypięty lub nie. – Niki
@nikie: To już nie działa, ma tylko taki sam efekt (jak już powiedziałeś). Odpowiednio zaktualizowałem swoją odpowiedź. To drobna, ale znacząca zmiana. – casperOne