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