在Java中是永久生成的空间垃圾收集?

Ash*_*ish 35 java garbage-collection

我已经读过Perm gen(或Permanent Generation)空间不是垃圾收集的.但是,在CMS集合中,我可以在GC日志中看到一些类正在卸载.那么在完全收集或CMS收集期间收集的perm gen垃圾是什么?

Sag*_*r V 34

PermGen像堆的其他部分一样被垃圾收集.

这里要注意的是PermGen包含类和对象的元数据,即指向分配对象的堆的其余部分的指针.PermGen还包含类加载器,它们必须在使用结束时手动销毁,否则它们将保留在内存中并且还保持对堆上对象的引用.由Jon Masamitsu撰写的关于Sun/Oracle博客网站的"呈现永久一代"文章可能会对您有所帮助.

  • 我已经列出了标题和作者,以便人们可以在链接再次中断时找到它. (4认同)
  • 纠正.这是一个Sun博客,所以它现在是一个Oracle博客:) (2认同)
  • Permgen 不是堆的一部分 (2认同)

Ste*_*n C 30

在当前的JVM中,permgen确实像堆的其他部分一样被收集.该visualgc的网页说,它正在与老一代的收集在一起.

在较旧的JVM中,这显然并非总是如此.例如,在Java 5中,CMS收集器默认情况下显然没有收集permGen:您可以使用它来启用它-XX:+CMSPermGenSweepingEnabled.我还记得听说过一些非常古老的JVM根本没有实现permgen集合,虽然我找不到可靠的资源......呃..."factoid".

另一点是,很多人错误地将"OutOfMemoryError:permgen"异常归因于根本没有被收集的permgen.现实是不同的.这些OOME的最常见原因是当您将代码热加载到正在执行的JVM中时会出现一种潜在的存储泄漏.发生泄漏是因为当一个已被替换的旧类的实例仍然可以访问时.这会导致对象的类可以访问,这会导致类类加载器可以访问,这会导致所有旧类都可以访问,连同它们的代码对象,它们的字符串文字,以及它们的静态框架和静态.很多这些泄漏的物体都存在于permgen空间.


UPDATE

从Java 8开始,permgen不再存在:JDK 8中的PermGen消除