Где находится "статический окончательный", непосредственно выделенный? молодой ген или старый ген или перманентный ген?

Является ли "статический окончательный", непосредственно выделенный в молодой ген или старый ген или пермский ген? (Думаю, он, скорее всего, приземлится на старый ген.) Если он будет выделен в перментовом gen, тогда будет ли сбор мусора, когда разгрузка классов происходит в Перми Ген?

Ответ 1

Является ли "статический финал" непосредственно отнесенным к молодому, старому или перманентному гену?

Объект, на который ссылается static final переменная static final будет распределен по тем же правилам, что и любой другой объект. Скорее всего, он будет выделен молодому поколению или старому поколению (если оно большое и применяются определенные другие условия).

Объект будет выделен new исполнением в некотором произвольном коде. JVM не может знать, что объект (в конечном итоге) будет присвоен static final переменной.

Пространство для кадра, содержащего статические переменные, вероятно, выделено в permGen. Конечно, это не обычный объект Java.

Если он будет выделен в perm gen, будет ли он собираться мусором, когда в Perm Gen происходит выгрузка классов?

Это зависит от того, является ли permGen сборщиком мусора. В современных JVM это так, и я ожидаю, что объекты, на которые ссылается статика незагруженных классов, будут собираться мусором в том же цикле GC или в следующем... при условии, что они недоступны.

В любом случае, вы не должны кодировать свое приложение, чтобы зависеть от какой-либо из этих деталей. Они специфичны для JVM.


Обратите внимание, что с Java 8 этот вопрос спорен, поскольку permgen больше не существует.