【问题标题】:PermGen and Heap, Difference and their significancePermGen和Heap,区别及其意义
【发布时间】:2012-06-16 02:39:22
【问题描述】:

朋友们,

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

与 Java VM 规范相关的解释会很有帮助

谢谢 普尼斯

【问题讨论】:

标签: java memory jvm heap-memory


【解决方案1】:

What does PermGen actually stand for? 中有很好的链接。特别喜欢这个blog

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 那不是真的。 PerGen 是一个独立于堆空间的空间。检查(这个)[blogs.oracle.com/jonthecollector/entry/…
    • 是的,你是对的。我不确定我是否另有阅读,但这确实有意义,因为他们通过分离它的目的是让 GC 不检查永久数据,所以它只是检查堆中他可以收集的“东西”。
    【解决方案3】:

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

    当任何新对象被构建时,它都会进入 Young Generation 的一部分的 Eden 空间。

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

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

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

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

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

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

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

        参考资料: Java Docs, Java GC Guide

        【讨论】:

          猜你喜欢
          • 2019-02-01
          • 2015-01-23
          • 2014-02-26
          • 2015-01-20
          • 1970-01-01
          • 2011-01-15
          • 2015-11-22
          • 2012-10-04
          • 2012-02-24
          相关资源
          最近更新 更多