1

如果我在 Java 中创建一个静态变量,它会自动进入堆上的 perm gen 空间吗?答案似乎是肯定的,但我无法在任何地方找到确认。我知道静态变量(也包括字符串和枚举)在 JVM 的生命周期中是有效的,所以它必须在永久堆上。这个对吗?

4

2 回答 2

2

“PermGen”的想法完全依赖于实现,并且 JVM 可以自由地处理“物理”内存管理,但对它们来说是有意义的——它们甚至不需要提供垃圾收集!

PermGen 只是一些 JVM 实现的一个特性(包括多年来的 Sun/Oracle HotSpot JVM),它实际上正在被 Oracle Java 8 JVM 中的一种新方法所淘汰。包含 PermGen 概念的 JVM 很可能会将静态变量放在那里以提高性能,但这完全取决于程序员。

于 2013-08-29T14:30:10.887 回答
0

JLS #17.4.1 共享变量

可以在线程之间共享的内存称为共享内存或堆内存。

所有实例字段、静态字段和数组元素都存储在堆内存中。在本章中,我们使用术语变量来指代字段和数组元素。局部变量(第 14.4 节)、形式方法参数(第 8.4.1 节)或异常处理程序参数永远不会在线程之间共享,并且不受内存模型的影响。

@Stephen 在这里很好的描述:java 中的静态分配 - 堆、堆栈和永久代

于 2013-08-29T14:26:17.163 回答