朋友们,
你能否请告诉我堆(heap)和永久代(PermGen)的意义、区别和用途? 同时也希望了解它们分别加载了哪些类。
与Java虚拟机规范相关的解释将非常有帮助。
谢谢, Punith
朋友们,
你能否请告诉我堆(heap)和永久代(PermGen)的意义、区别和用途? 同时也希望了解它们分别加载了哪些类。
与Java虚拟机规范相关的解释将非常有帮助。
谢谢, Punith
内存(堆)按照不同年龄的对象被分配在不同的代或内存池中进行管理。当某个代填满时,它就会进行垃圾回收。对象被分配到年轻代或者young generation
中用于存放年轻对象,因为大部分对象都是“早夭”的。
每当创建一个新的对象时,它都会被放入到Eden空间中,这是Young Generation
的一部分。
如果对象在一段时间后仍然存活,则会被移到tenured generation
,其中存放着长寿命的对象。
如果对象需要存活到整个进程结束,那么它将会被移动到Perm Generation
。Java类
存放在永久代中。
我不是专家,但PermGem内存位于堆中,因为它是一个特殊的地方,在运行时加载所有类。因此,如果您有太多类,PermGem会抛出OutOfMemoryException。堆存储您在Java代码中实例化的对象,其中GC收集在堆栈中运行的线程中未被任何变量引用的对象。
我相信Permgen只是堆内存中的一个内存区域。它被创建出来是为了特殊目的,比如保存字符串。
并不是所有创建的对象都会占用Permgen内存,它只为JDK 6或更早版本中的特殊类(如String)所使用。
在现代的JDK版本中,如8及以上版本,已经没有Permgen了,但是引入了新的内存,如非堆内存和其他各种缓存内存。