15

朋友们,

你能告诉我堆和永久代的意义、区别和用途吗?此外,最好知道它们分别加载了哪些类。

与 Java VM 规范相关的解释将非常有帮助

谢谢普尼斯

4

5 回答 5

22

内存(堆)是分代管理的,或者是保存不同年龄对象的内存池。当代填满时,垃圾收集发生在每一代中。对象在一代中分配给较年轻的对象或young generation,并且由于婴儿死亡率,大多数对象都死在那里。

当任何新对象被构造时,它都会进入伊甸园空间,这是Young Generation.

如果对象在一段时间后仍然活着,它会转到tenured generation长寿对象所在的位置。

如果对象应该存在直到存在过度进程,则对象被移动到Perm Generation. Java classes存储在永久代中。

于 2012-06-13T07:25:40.420 回答
2

良好的链接在PermGen 实际上代表什么?. 特别喜欢这个博客

于 2012-06-13T07:12:15.227 回答
1

我对 PermGen 和其他堆内存部分也有同样的疑问。经过一番搜索,我终于得出了结论。

Java HotSpot VM 需要从操作系统获取的内存,这种内存称为堆内存。现在众所周知的堆内存用于存储对象并保存其他重要的东西。

短寿命 Java 对象存储在年轻代中,如果这些对象仍需要进一步执行,则将其转移到终身/老年代。并且根据 Generation Garbage Collector 的类型,内存被清理。

那么永久一代(PermGen)呢?Java HotSpot VM 在 PermGen 中加载类/类结构,JVM 使用它来存储加载的类和其他元数据。PermGen 不用于存储对象。

除了对象和类结构之外,JVM 代码本身还加载分析器代理代码和数据等。

所以基本上,堆 = 对象 + 类结构 + JVM 架构。

参考: Java DocsJava GC 指南

于 2018-08-04T22:01:34.770 回答
0

好吧,我不是专家,但是 PermGem 内存驻留在堆中,因为它就像一个特殊的地方,所有类都在运行时加载。所以如果你有太多的类,PermGem 会抛出 OutOfMemoryException。并且堆存储您在 java 代码中实例化的对象,其中 GC 收集堆栈中正在运行的线程中的任何变量未引用的对象。

于 2012-06-13T07:12:49.350 回答
0

我相信 Permgen 只是堆内存中的内存区域。它是为特殊目的而创建的,例如持有 String。

所有创建的对象都不会获得 Permgen Memory 仅适用于 JDK 6 或更低版本中的 String 等特殊类。

在现代 JDK 8 及以上版本中,没有找到 Pergen,但是引入了像非堆这样的新内存和其他各种缓存内存。

于 2015-09-08T14:25:37.033 回答