Является ли "статический окончательный", непосредственно выделенный в молодой ген или старый ген или пермский ген? (Думаю, он, скорее всего, приземлится на старый ген.) Если он будет выделен в перментовом gen, тогда будет ли сбор мусора, когда разгрузка классов происходит в Перми Ген?
Где находится "статический окончательный", непосредственно выделенный? молодой ген или старый ген или перманентный ген?
Ответ 1
Является ли "статический финал" непосредственно отнесенным к молодому, старому или перманентному гену?
Объект, на который ссылается static final
переменная static final
будет распределен по тем же правилам, что и любой другой объект. Скорее всего, он будет выделен молодому поколению или старому поколению (если оно большое и применяются определенные другие условия).
Объект будет выделен new
исполнением в некотором произвольном коде. JVM не может знать, что объект (в конечном итоге) будет присвоен static final
переменной.
Пространство для кадра, содержащего статические переменные, вероятно, выделено в permGen. Конечно, это не обычный объект Java.
Если он будет выделен в perm gen, будет ли он собираться мусором, когда в Perm Gen происходит выгрузка классов?
Это зависит от того, является ли permGen сборщиком мусора. В современных JVM это так, и я ожидаю, что объекты, на которые ссылается статика незагруженных классов, будут собираться мусором в том же цикле GC или в следующем... при условии, что они недоступны.
В любом случае, вы не должны кодировать свое приложение, чтобы зависеть от какой-либо из этих деталей. Они специфичны для JVM.
Обратите внимание, что с Java 8 этот вопрос спорен, поскольку permgen больше не существует.