友
你能否告诉我Heap和PermGen的意义,差异和用途。 同样最好知道它们分别加载了什么类。
与Java VM规范相关的解释非常有用
由于 Punith
答案 0 :(得分:22)
内存(堆)是代代管理的,或者是存放不同年龄对象的内存池。当生成填满时,每一代都会发生垃圾收集。对象在一代中被分配用于较年轻的物体或young generation
,并且由于婴儿死亡,大多数物体死在那里。
当构造任何新对象时,它会进入Eden空间,这是Young Generation
的一部分。
如果对象在一段时间后仍然存在,则会转到tenured generation
,其中存在长寿命对象。
如果对象应该存在,直到存在过程,则将对象移动到Perm Generation
。Java 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 Docs, Java 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和其他各种缓存。