是永久生成堆的一部分,还是它位于jvm中的不同空间

时间:2011-12-06 21:46:29

标签: jvm heap permgen

我已经看到关于这个问题的多个评论 - 有些人说是,有些人说不,而且许多答案都含糊不清。任何人都可以用更简单的术语描述它所在的位置吗?在一篇文章中,我甚至看到有人说它与类内存共享相同的内存位置,类是由类加载器加载的 - 这是真的吗?

5 个答案:

答案 0 :(得分:3)

原文(也许是错误的)答案:如果要相信wikipedia,那就是堆的一部分。

编辑:我更多地了解了这一点,包括OP评论中引用的网站。在这项研究中,我遇到了this SO question,它引用了this document,这表明对于Sun Java(版本6),永久集合实际上在堆之外。也就是说,我不是Java专家,之前没有意识到这个级别的内存管理细节。如果我的阅读是正确的,永久代的放置 - 甚至是存在 - 是一个jvm实现细节。

答案 1 :(得分:2)

从黑盒的角度来看,在Sun JVM中,永久代不是的一部分,如jconsole's documentation中所述:

  

永久生成(非堆):包含所有内容的池   虚拟机本身的反射数据,如类和   方法对象。对于使用类数据共享的Java VM,这个   生成分为只读和读写区域。

实际上,这意味着您的-XX:MaxPermSize内存会在JVM进程中累加到-Xmx内存,因为堆中不包含永久生成。

答案 2 :(得分:1)

以下是我对该主题的理解:

永久代 是存储类定义的堆区域。如http://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation所示,所有类实例都有一个'klass'引用,指向永久代中其类型类的实例。在运行时创建新类型时,会在永久生成中为其类型分配新空间。

Jon Masamitsu博客文章中的图表显示了永久生成与堆中更频繁收集的部分之间的逻辑分离,可以存储程序的对象实例。永久世代仍然是堆的一部分。

答案 3 :(得分:1)

我在阅读Java Garbage Collection Basics时遇到了同样的问题,在这个turtorial中,作者认为永久生成是堆的一部分。

但我们都有:

  • -Xmx
  • -XX:MaxPermSize参数

在google问题之后,我发现了这些问题Java heap terminology: young, old and permanent generations?,答案总结如下:

永久生成不是堆

的一部分

答案 4 :(得分:0)

从Java 8中删除了Permgen。现在我们有了metaspace,它不是堆的一部分,也是内存的一部分。

也是命令 -Xmx -XX:MaxPermSize参数 将被Java 8忽略

http://java.dzone.com/articles/java-8-permgen-metaspace