我读到过Perm gen (或Permanent Generation)空间不是垃圾回收的。但是,在CMS集合中,我可以在GC日志中看到一些类正在卸载。那么,perm gen垃圾回收是在完全回收还是CMS回收过程中进行的?
发布于 2010-09-26 11:27:15
与堆的其他部分一样,PermGen也被垃圾收集。
这里要注意的是,PermGen包含类和对象的元数据,即指向分配对象的堆的其余部分的指针。PermGen还包含类加载器,这些类加载器在使用结束时必须手动销毁,否则它们会留在内存中,并保持对堆中对象的引用。Jon Masamitsu在Sun / Oracle博客站点上的"Presenting the Permanent Generation"文章可能会对您有所帮助。
发布于 2011-03-22 13:57:46
在当前一代的JVM中,permgen确实像堆的其他部分一样被收集。visualgc页面说明它是与老一代一起收集的。
在较旧的JVM中,这显然并不总是如此。例如,在Java5中,默认情况下CMS收集器显然不会收集permGen :您可以用-XX:+CMSPermGenSweepingEnabled启用它。我还记得听说过一些非常旧的JVM根本没有实现permgen集合,尽管我找不到可靠的来源……嗯..。"factoid“。
另一点是,很多人错误地将"OutOfMemoryError : permgen“异常归因于根本没有收集permgen。现实是不同的。这些OOME最常见的原因是一种隐蔽的存储泄漏,当您将代码热加载到正在执行的JVM中时,这种泄漏就会显现出来。发生泄漏的原因是,当某个已替换的旧类的实例仍然可访问时。这将导致对象的类是可访问的,这将导致类类加载器是可访问的,这将导致所有旧类以及它们的代码对象、它们的字符串文字以及它们的静态框架和静态对象都是可访问的。许多这些泄漏的物体存在于permgen空间中。
更新
从Java8开始,permgen不再存在:PermGen elimination in JDK 8
https://stackoverflow.com/questions/3796427
复制相似问题