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