PermGen和Heap,差异及其意义

时间:2012-06-13 07:07:11

标签: java memory jvm heap-memory

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

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

由于 Punith

5 个答案:

答案 0 :(得分:22)

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

当构造任何新对象时,它会进入Eden空间,这是Young Generation的一部分。

如果对象在一段时间后仍然存在,则会转到tenured generation,其中存在长寿命对象。

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

Java HotSpot VM需要从操作系统获取的内存,该内存称为堆内存。现在,以众所周知的堆内存来存储对象并保存其他重要内容。

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

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

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

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

参考: Java DocsJava GC Guide

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

在现代JDK版本(如8及更高版本)中,未找到Pergen,但会引入新内存,如Non Heap和其他各种缓存。