PermGen和Heap,差异及其意义

朋友们,

你能否告诉我Heap和PermGen的意义,差异和用途。 最好分别知道它们中加载了哪个类。

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

谢谢Punith

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

当构造任何新物体时,它会进入伊甸园空间,这是Young Generation的一部分。

如果物体在一段时间后仍然存在,那么它将进入tenured generation物体,在那里长寿物体就会存在。

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

PermGen实际上代表的是什么? 。 特别喜欢这个博客

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

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

创建的所有对象都没有得到Permgen Memory它只适用于JDK 6或更低版本中的String之类的特殊clasess。

在像8及更高版本的现代JDK版本中,没有找到Pergen,但是引入了像Non Heap和其他各种缓存的新内存。

我对PermGen和其他堆内存部分有同样的疑问。 在做了一些搜索之后,这里我最终得出结论。

Java HotSpot VM需要从操作系统获取的内存,此内存称为堆内存。 现在堆存储器就像存储对象一样着名,它也有其他重要的东西。

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

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

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

所以基本上,heap = object + class structure + JVM体系结构。

参考资料: Java Docs , Java GC Guide