CMSPermGenSweepingEnabled与CMSClassUnloadingEnabled的区别

69
我之前曾问过类似的问题:JVM标志CMSClassUnloadingEnabled到底是干嘛用的?,不过这一次有些许不同!如果我使用-XX:+CMSPermGenSweepingEnabled标志启动Java虚拟机,会输出以下信息:

请在未来使用CMSClassUnloadingEnabled代替CMSPermGenSweepingEnabled

-XX:+CMSPermGenSweepingEnabled标志常常被用来缓解PermGen OutOfMemory错误,但我在其他地方看到有人称,通过遵循上述建议仍然出现了这些错误。但是如果同时使用-XX:+CMSPermGenSweepingEnabled-XX:+CMSClassUnloadingEnabled,他们的虚拟机在重启时间间隔内保持运行更长时间。
那么,-XX:+CMSClassUnloadingEnabled是否真正取代了-XX:+CMSPermGenSweepingEnabled,还是同时使用它们两个仍有益处?
注:我知道导致perm gen问题的根本原因通常是类加载器泄漏,但这更多关于JVM使用上述选项产生的信息。
1个回答

78

据我所知,1.6 JVM 对 CMSPermGenSweepingEnabled 唯一的作用就是打印出这个消息 - 它不像在1.5版本中那样被处理。如果要使 CMSClassUnloadingEnabled 生效,则还必须同时设置 UseConcMarkSweepGC


1
谢谢 - 你有任何链接或其他方式来证实吗? - Rich
28
请下载JDK源代码(其中包含热点代码)并查看 hotspot/src/share/vm/runtime/globals.hpp 文件。在1.5版本中,存在 CMSPermGenSweepingEnabled ,但在1.6版本中不存在。此外,1.6版本的 hotspot/src/share/vm/runtime/arguments.cpp 中包含用于打印消息的新代码。 - kschneid
好的,查看了JDK 1.6.23源代码,除了globals.hpp文件中将其设置为false之外,没有发现任何使用它的地方。所以它真的被使用了吗?如果我错过了它被使用的地方,请见谅。 - user253202
14
在Java 1.7中,-XX:+CMSClassUnloadingEnabled和-XX:+CMSPermGenSweepingEnabled无法使用,参见链接:http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#BehavioralOptions。 - Marko Vranjkovic
8
据Oracle称(请见https://blogs.oracle.com/poonam/entry/about_g1_garbage_collector_permanent),Java 1.7仍然支持选项“-XX:+CMSClassUnloadingEnabled”。 - Chris B.
1
不再适用于1.8 - https://blogs.oracle.com/poonam/about-g1-garbage-collector,-permanent-generation-and-metaspace - mtuulu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接