2015-02-10 44 views
5

名单的垃圾收集:什么Java垃圾收集器清理PermGen?

  • 串行GC
  • 并行GC
  • 并行老GC
  • 浓马克扫描GC
  • G1 GC

我知道浓马克Sweep GC支持在启用ClassUnloading JVM选项时清除PermGen。其他垃圾收集器是否支持清理PermGen?

原因:我们使用Spring,Hibernate和Groovy来创建很多代理,并且Perm Gen变得很大。

编辑: 应该提到我正在使用Java 7.我知道Java 8将删除Perm Gen,并希望在未来某个时候升级。与此同时,我的问题是关于其他垃圾收集器是否支持清除除Conc Mark Sweep之外的PermGen。

  • 串行GC
  • 并行GC(相信 - 服务器默认使用此,并确认它清理烫发根)
  • 并行老GC
  • 浓马克扫GC(可使用JVM清理烫发根标志)
  • G1 GC
+1

如果你得到OOME:PermGen空间错误,那很可能是由于内存泄漏,而不是有故障的GC引擎。 – 2015-02-10 14:06:20

+1

您可以升级到Java 8,其中PermGen [已被删除](http://openjdk.java.net/jeps/122)。 – Jesper 2015-02-10 14:07:53

回答

3

所有的算法都是清洁的PermGen,但

  • 并不是每个GC周期包括PermGen的清洁
  • CMS可以清洁PermGen的同时,G1已经要求停止的世界全GC卸载类(清洁的PermGen)直到的Java 8u40
  • 的Java 8有元空间中,而不是PermGen的,但它需要被垃圾收集太(否则你会得到在元空间中OOME)

我一直争取在OOME相当PermGen的很多,当我主动使用类加载器来模拟多个JVM在tes的单一过程中目的。我的结论是:PermGen GC不太可靠。一次运行按预期工作,另一次则抛出OOEM。

+1

通过CMS(通过'-XX:+ UseConcMarkSweepGC'启用),您可能需要添加一些JVM参数以实际使垃圾收集PermGen。我相信最常见的是你想添加'-XX:+ CMSClassUnloadingEnabled'。有时候您可能还需要'-XX:+ CMSPermGenSweepingEnabled',所以我建议在启动时添加并注意stdout/stderr。 也同意不可预测性,至少与Parallell一致。在我的[ClassLoader泄漏预防库](https://github.com/mjiderhamn/classloader-leak-prevention)上工作时,CMS和G1对我来说更加可靠。 – 2015-02-16 13:32:09