Ось дещо інший приклад, той із полями остаточного посилального типу, а не локальними змінними остаточного значення:
public class MyClass {
public final MyOtherObject obj;
}
Кожного разу, коли ви створюєте екземпляр MyClass, ви будете створювати вихідне посилання на екземпляр MyOtherObject, і GC повинен буде перейти за цим посиланням, щоб шукати реальні об'єкти.
JVM використовує алгоритм розгортання позначок GC, який повинен перевірити всі реальні рецензії в "кореневих" місцях GC (як і всі об'єкти в поточному стеку викликів). Кожен живий об'єкт "позначений" як живий, а будь-який об'єкт, на який посилається живий об'єкт, також позначений як живий.
Після завершення етапу позначки GC проносить купу, звільняючи пам'ять для всіх не позначених об'єктів (і ущільнюючи пам'ять для решти об'єктів, що живуть).
Крім того, важливо визнати, що куча пам'яті Java розділена на "молоде покоління" і "старе покоління". Всі об'єкти спочатку виділяються молодому поколінню (іноді їх називають "дитячою"). Оскільки більшість об’єктів недовговічні, ГК більш агресивно ставиться до звільнення недавнього сміття від молодого покоління. Якщо об'єкт переживає цикл збору молодого покоління, він переходить у старе покоління (іноді його називають "щасливим поколінням"), яке обробляється рідше.
Отже, з кінця голови я збираюся сказати "ні, модифікатор" остаточний "не допомагає GC зменшити навантаження".
На мій погляд, найкраща стратегія для оптимізації управління пам’яттю в Java - це якнайшвидше усунення помилкових посилань. Ви можете зробити це, призначивши "null" посилання на об'єкт, як тільки ви закінчите його використовувати.
Або, ще краще, мінімізувати розмір кожної області декларації. Наприклад, якщо ви оголошуєте об'єкт на початку методу з 1000 рядків, і якщо об'єкт залишається живим до закінчення області дії цього методу (останньої фігурної фігурної дужки), тоді об'єкт може залишатися в живих набагато довше, ніж насправді необхідний.
Якщо ви використовуєте невеликі методи, що мають лише близько десятка рядків коду, тоді об’єкти, оголошені в цьому методі, швидше вийдуть за межі сфери дії, і GC зможе виконати більшу частину своєї роботи в рамках набагато ефективнішого молоде покоління. Ви не хочете, щоб об’єкти переносились у старше покоління, якщо це не є абсолютно необхідним.