2011-03-20 5 views
5
// in a garbage collected VM, destroy someObject: 
someObject.a = null; 
someObject.b = null; 
someObject = null; 

Słyszałem, że w dobrej maszynie wirtualnej, takiej jak Java czy C#, nie powinieneś tego robić. Ustawienie someObject do spowolnienia zbierania śmieci, ponieważ GC trwa dłużej, aby dowiedzieć się, że wcześniej wspomniane obiekty nie są już przywoływane, natomiast jeśli pozostawisz je w stanie nienaruszonym, GC natychmiast sprawdzi je, gdy sprzątanie someObject.Ustawia odniesienia do wartości null w obiekcie, który ma być GC?

Zakładając, że to, co usłyszałem, jest prawdą (popraw mnie, jeśli nie), czy to samo dotyczy AVM2, ActionScript 3 VM (w szczególności w najnowszych wersjach Flash Playera)?

Powodem, dla którego pytam, jest to, że mam kolegę, który to robi, ponieważ nauczył się u poprzedniego pracodawcy, że jest szybszy, i że Flash ma wiele takich dziwactw (co łatwo mi uwierzyć).

Zastanawiam się, czy te informacje są nadal aktualne (w przypadku innych optymalizacji Flash, jak również). Z mojego doświadczenia wynika, że ​​takie sztuczki optymalizacyjne szybko stają się przestarzałe na platformie życia.

+0

Nie powinieneś nawet zastanawiać się, czy to dobry pomysł, czy nie. – delnan

Odpowiedz

2

Nie mogę podać żadnych konkretnych, twardych danych, dla których jest szybsze - ustawienie wartości NULL lub nie. Naprawdę nie wierzę, że ktoś to zrobi.

Najlepsze, co mogę zrobić, to przekazać pewne informacje dotyczące zbierania śmieci i podjąć decyzję.

Od Flash Player 9 do Flash Player 10 Adobe poczyniło poważne postępy, szczególnie w zakresie zarządzania pamięcią. Wystąpiło kilka błędów pamięci "ładowanie zewnętrznych plików SWF", brakowało odsyłaczy bez odwołań itp. Większość z nich została naprawiona.

Grant Skinner wyróżnił techniki używane przez GC do ustalenia, które obiekty powinny zostać usunięte. Zobacz tę znakomitą prezentację (z kilkoma fajnymi interakcjami) na temat jej działania: http://gskinner.com/talks/resource-management/ (ale pamiętaj, że prezentacja dotyczy FP9).

Jak twierdzi, istnieje liczenie referencji i zamiana znaczników. Ostatecznie GC w AS3 sprowadza się do referencji. Jeśli obiekt (typ niedozwolony) ma odniesienie do niego, nie zostanie usunięty, ale jeśli nie, tj. Nie ma możliwości uzyskania do niego dostępu, zostanie oznaczony do usunięcia. ALE nie można kontrolować, kiedy faktycznie nastąpi usunięcie - może to być ta ramka, może być następna.

Ostatecznie "null'ing" każda zmienna/własność (odniesienie lub inne), moim zdaniem jest marnotrawstwem i bardzo niemanegemable. Może być praktyczny w przypadku mniejszych rzeczy, ale gdy obiekty stają się większe ze 100 zmiennych, nie można ich całkowicie anulować.

W dół ścieżki Flash Player zoptymalizuje ich GC tylko w odpowiedni sposób, a nie odwrotnie.

Powiązane problemy