什么 Java 垃圾收集器清理 PermGen?
What Java Garbage Collectors cleanup PermGen?
垃圾收集器列表:
- 串行 GC
- 并行 GC
- 并行旧 GC
- Conc Mark Sweep GC
- G1 GC
我知道当您启用 ClassUnloading JVM 选项时,Conc Mark Sweep GC 支持清理 PermGen。其他垃圾收集器是否支持清理 PermGen?
原因:我们使用 Spring、Hibernate 和 Groovy 创建大量代理,Perm Gen 变大。
编辑:
应该提到我正在使用 Java 7。我知道 Java 8 删除了 Perm Gen,希望将来会升级。与此同时,我的问题是除了 Conc Mark Sweep 之外,其他垃圾收集器是否支持清理 PermGen。
- 串行 GC
- 并行 GC(相信服务器默认使用它并确认它清理了 perm gen)
- 并行旧 GC
- Conc Mark Sweep GC(可以使用 JVM 标志清理 perm gen)
- G1 GC
所有算法都在清理 PermGen,但是
- 并非每个 GC 周期都包括 PermGen 清理
- CMS 可以并发清理 PermGen,G1 一直要求stop-the-world Full GC 卸载类(清理 PermGen) 直到 Java 8u40
- Java 8 有元空间而不是 PermGen,但它也需要被垃圾收集(否则你会在元空间中得到 OOME)
当我积极使用 ClassLoaders 在单个进程中模拟多个 JVM 以进行测试时,我一直在 PermGen 中与 OOME 作斗争。我的结论是:PermGen GC 不是很可靠。一个 运行 它按预期工作,另一个它抛出 OOEM。
perm gen 的问题在于它不应该是动态的,它应该是静态数据,例如 classes 和常量。但是我们开发人员正在使用 java 做的事情是动态创建 classes、重新定义 classes 等,这需要更动态地使用 space,这就是为什么在 metaspace 的情况下,它必须是。
perm gen 的最大问题,回到你的问题,IMO 不会随着 metaspace 消失,是 class 加载器的创建和销毁,因为它太容易了泄漏 ThreadLocals 和其他 class 加载程序加载的其他库中的 class 元数据,这将留下无法被您使用的任何收集器回收的活动对象。
如今所有生产垃圾收集器都会清理元数据space,但是,它们不一定会以与其他内存区域相同的频率清理它
垃圾收集器列表:
- 串行 GC
- 并行 GC
- 并行旧 GC
- Conc Mark Sweep GC
- G1 GC
我知道当您启用 ClassUnloading JVM 选项时,Conc Mark Sweep GC 支持清理 PermGen。其他垃圾收集器是否支持清理 PermGen?
原因:我们使用 Spring、Hibernate 和 Groovy 创建大量代理,Perm Gen 变大。
编辑: 应该提到我正在使用 Java 7。我知道 Java 8 删除了 Perm Gen,希望将来会升级。与此同时,我的问题是除了 Conc Mark Sweep 之外,其他垃圾收集器是否支持清理 PermGen。
- 串行 GC
- 并行 GC(相信服务器默认使用它并确认它清理了 perm gen)
- 并行旧 GC
- Conc Mark Sweep GC(可以使用 JVM 标志清理 perm gen)
- G1 GC
所有算法都在清理 PermGen,但是
- 并非每个 GC 周期都包括 PermGen 清理
- CMS 可以并发清理 PermGen,G1 一直要求stop-the-world Full GC 卸载类(清理 PermGen) 直到 Java 8u40
- Java 8 有元空间而不是 PermGen,但它也需要被垃圾收集(否则你会在元空间中得到 OOME)
当我积极使用 ClassLoaders 在单个进程中模拟多个 JVM 以进行测试时,我一直在 PermGen 中与 OOME 作斗争。我的结论是:PermGen GC 不是很可靠。一个 运行 它按预期工作,另一个它抛出 OOEM。
perm gen 的问题在于它不应该是动态的,它应该是静态数据,例如 classes 和常量。但是我们开发人员正在使用 java 做的事情是动态创建 classes、重新定义 classes 等,这需要更动态地使用 space,这就是为什么在 metaspace 的情况下,它必须是。
perm gen 的最大问题,回到你的问题,IMO 不会随着 metaspace 消失,是 class 加载器的创建和销毁,因为它太容易了泄漏 ThreadLocals 和其他 class 加载程序加载的其他库中的 class 元数据,这将留下无法被您使用的任何收集器回收的活动对象。
如今所有生产垃圾收集器都会清理元数据space,但是,它们不一定会以与其他内存区域相同的频率清理它