Ето един малко по-различен пример, такъв с крайни полета от референтен тип, а не локални променливи от окончателен тип стойност:
public class MyClass {
public final MyOtherObject obj;
}
Всеки път, когато създавате екземпляр на MyClass, вие ще създавате изходяща препратка към екземпляр на MyOtherObject и GC ще трябва да следва тази връзка, за да търси живи обекти.
JVM използва GC алгоритъм за маркиране, който трябва да изследва всички референции на живо в "коренните" местоположения на GC (като всички обекти в текущия стек за извикване). Всеки жив обект е "маркиран" като жив и всеки обект, посочен от жив обект, също е маркиран като жив.
След завършване на фазата на маркиране, GC преминава през купчината, освобождавайки памет за всички немаркирани обекти (и уплътнявайки паметта за останалите живи обекти).
Освен това е важно да се признае, че паметта на Java heap е разделена на „младо поколение“ и „старо поколение“. Всички обекти първоначално се разпределят в младото поколение (понякога наричано "детската стая"). Тъй като повечето обекти са краткотрайни, GC е по-агресивен за освобождаване на скорошен боклук от младото поколение. Ако даден обект оцелее в цикъл на събиране на младото поколение, той се премества в старото поколение (понякога наричано "генерирано поколение"), което се обработва по-рядко.
И така, отгоре наум ще кажа „не, „окончателният“ модификатор не помага на GC да намали натоварването си“.
По мое мнение най-добрата стратегия за оптимизиране на управлението на вашата памет в Java е да елиминирате фалшивите препратки възможно най-бързо. Можете да направите това, като присвоите "null" на препратка към обект веднага щом приключите с използването му.
Или, още по-добре, минимизирайте размера на обхвата на всяка декларация. Например, ако декларирате обект в началото на метод от 1000 реда и ако обектът остане жив до затварянето на обхвата на този метод (последната затваряща фигурна скоба), тогава обектът може да остане жив много по-дълго от действителното необходимо.
Ако използвате малки методи, само с дузина редове код, тогава обектите, декларирани в рамките на този метод, ще изпаднат от обхвата по-бързо и GC ще може да върши по-голямата част от работата си в рамките на много по-ефективния младо поколение. Не искате обекти да се преместват в по-старото поколение, освен ако не е абсолютно необходимо.
person
benjismith
schedule
20.11.2008