【发布时间】:2012-06-16 02:39:22
【问题描述】:
朋友们,
你能告诉我堆和永久代的意义、区别和用途吗? 此外,最好知道它们分别加载了哪些类。
与 Java VM 规范相关的解释会很有帮助
谢谢 普尼斯
【问题讨论】:
标签: java memory jvm heap-memory
朋友们,
你能告诉我堆和永久代的意义、区别和用途吗? 此外,最好知道它们分别加载了哪些类。
与 Java VM 规范相关的解释会很有帮助
谢谢 普尼斯
【问题讨论】:
标签: java memory jvm heap-memory
What does PermGen actually stand for? 中有很好的链接。特别喜欢这个blog
【讨论】:
好吧,我不是专家,但是 PermGem 内存驻留在堆中,因为它就像一个特殊的地方,所有类都在运行时加载。所以如果你有太多的类,PermGem 会抛出 OutOfMemoryException。并且堆存储您在 java 代码中实例化的对象,GC 收集堆栈中正在运行的线程中的任何变量未引用的对象。
【讨论】:
内存(堆)是分代管理的,或者是保存不同年龄对象的内存池。当代填满时,垃圾收集发生在每一代。对象在一代中分配给较年轻的对象或young generation,并且由于婴儿死亡率,大多数对象都死在那里。
当任何新对象被构建时,它都会进入 Young Generation 的一部分的 Eden 空间。
如果对象在一段时间后仍然活着,它会转到长寿命对象所在的tenured generation。
如果对象应该一直存在直到存在过度进程,则对象被移动到Perm Generation。Java classes 存储在永久代中。
【讨论】:
我相信 Permgen 只是堆内存中的内存区域。它是为特殊目的而创建的,例如持有 String。
所有创建的对象都不会获得 Permgen Memory 仅适用于 JDK 6 或更低版本中的 String 等特殊类。
在现代 JDK 8 及以上版本中,没有找到 Pergen,但是引入了新的内存,如非堆和其他各种缓存内存。
【讨论】:
我对 PermGen 和其他堆内存部分也有同样的疑问。经过一番搜索,我终于得出了结论。
Java HotSpot VM 需要从操作系统获得的内存,这种内存称为堆内存。现在众所周知的堆内存用于存储对象并保存其他重要的东西。
短寿命 Java 对象存储在年轻代中,如果这些对象仍需要进一步执行,则将其转移到终身/老年代。并且根据 Generation Garbage Collector 的类型,内存会被清理。
永久一代(PermGen)呢? Java HotSpot VM 在 PermGen 中加载类/类结构,JVM 使用它来存储加载的类和其他元数据。 PermGen 不用于存储对象。
除了对象和类结构之外,JVM 代码本身还加载分析器代理代码和数据等。
所以基本上,堆 = 对象 + 类结构 + JVM 架构。
参考资料: Java Docs, Java GC Guide
【讨论】: