Вот немного другой пример, пример с окончательными полями ссылочного типа, а не с локальными переменными окончательного типа значения:
public class MyClass {
public final MyOtherObject obj;
}
Каждый раз, когда вы создаете экземпляр MyClass, вы будете создавать исходящую ссылку на экземпляр MyOtherObject, и GC должен будет перейти по этой ссылке для поиска живых объектов.
JVM использует алгоритм GC разметки-развертки, который должен проверять все живые ссылки в «корневых» местоположениях GC (как и все объекты в текущем стеке вызовов). Каждый живой объект «помечен» как живой, а любой объект, на который ссылается живой объект, также помечен как живой.
После завершения фазы пометки ГХ просматривает кучу, освобождая память для всех немаркированных объектов (и уплотняя память для оставшихся живых объектов).
Также важно признать, что куча памяти Java разделена на «молодое поколение» и «старое поколение». Все объекты изначально выделяются в молодом поколении (иногда его называют «ясли»). Поскольку большинство объектов недолговечны, сборщик мусора более агрессивен в отношении освобождения недавнего мусора от молодого поколения. Если объект переживает цикл сбора данных молодого поколения, он перемещается в старое поколение (иногда называемое «постоянным поколением»), которое обрабатывается реже.
Итак, я собираюсь сказать «нет,« последний »модификатор не помогает GC снизить свою рабочую нагрузку».
На мой взгляд, лучшая стратегия оптимизации управления памятью в Java - как можно быстрее устранить ложные ссылки. Вы можете сделать это, назначив «null» для ссылки на объект, как только вы закончите, используя его.
Или, еще лучше, минимизировать размер каждой области объявления. Например, если вы объявляете объект в начале 1000-строчного метода, и если объект остается живым до закрытия области действия этого метода (последней закрывающей фигурной скобки), тогда объект может оставаться живым гораздо дольше, чем на самом деле необходимо.
Если вы используете небольшие методы, содержащие всего около дюжины строк кода, то объекты, объявленные в этом методе, будут быстрее выходить из области видимости, и GC сможет выполнять большую часть своей работы в течение большей части времени. более эффективное молодое поколение. Вы не хотите, чтобы объекты перемещались в старшее поколение без крайней необходимости.