什么 Java 垃圾收集器清理 PermGen?

Col*_*nMc 4 java garbage-collection permgen

垃圾收集器列表:

  • 串行气相色谱
  • 并行GC
  • 并行旧GC
  • Conc Mark Sweep GC
  • G1 气相色谱

我知道当您启用 ClassUnloading JVM 选项时,Conc Mark Sweep GC 支持清理 PermGen。其他垃圾收集器是否支持清理 PermGen?

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

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

  • 串行气相色谱
  • Parallel GC(相信 -server 默认使用它并确认它清理了 perm gen)
  • 并行旧GC
  • Conc Mark Sweep GC(可以使用 JVM 标志清理 perm gen)
  • G1 气相色谱

Ale*_*zin 5

所有算法都在清理 PermGen,但是

  • 并非每个 GC 周期都包括 PermGen 清洁
  • CMS 可以同时清理 PermGen ,G1 一直要求stop-the-world Full GC卸载类(清理 PermGen)直到 Java 8u40
  • Java 8 有元空间而不是 PermGen,但它也需要被垃圾收集(否则你会在元空间中得到 OOME)

当我积极使用类加载器在单个进程中模拟多个 JVM 以进行测试时,我一直在 PermGen 中与 OOME 斗争很多。我的结论是:PermGen GC 不是很可靠。一次运行它按预期工作,其他运行它抛出 OOEM。

  • 使用 CMS(通过 `-XX:+UseConcMarkSweepGC` 启用)你可能需要添加一些 JVM 参数来真正让它垃圾收集 PermGen。我相信最常见的是你想要添加`-XX:+CMSClassUnloadingEnabled`。有时你可能还需要`-XX:+CMSPermGenSweepingEnabled`,所以我建议添加它并在启动时观察stdout/stderr。也同意不可预测性,至少同意 Parallell。在处理我的 [ClassLoader Leak Prevention 库](https://github.com/mjiderhamn/classloader-leak-prevention) 时,CMS 和 G1 对我来说更加可靠 (2认同)