CMSPermGenSweepingEnabled与CMSClassUnloadingEnabled

Ric*_*ich 68 java jvm-arguments

我之前有点问过这个问题 - JVM标志CMSClassUnloadingEnabled实际上做了什么?,但这一次略有不同!

如果我启动了-XX:+CMSPermGenSweepingEnabled设置了标志的Java VM,则会打印以下消息:

请在将来使用CMSClassUnloadingEnabled代替CMSPermGenSweepingEnabled

-XX:+CMSPermGenSweepingEnabled标志通常用于缓解PermGen OutOfMemory错误,但是我在其他地方已经读过,人们已经发现通过遵循上述建议他们仍然有这些错误,但是通过坚持-XX:+CMSPermGenSweepingEnabled以及-XX:+CMSClassUnloadingEnabled他们的VM在重启之间保持更长时间.

是否-XX:+CMSClassUnloadingEnabled真的取代-XX:+CMSPermGenSweepingEnabled或者是否仍然有两个好处?

提前致谢

丰富ps:我知道perm gen问题的根本原因仍然是Classloader泄漏,这更多是关于JVM在我们使用上述选项时产生的消息.

ksc*_*eid 77

据我所知,1.6 JVM唯一能做的CMSPermGenSweepingEnabled就是打印那条消息 - 它的处理方式不是1.5.为了CMSClassUnloadingEnabled产生任何影响,UseConcMarkSweepGC还必须设置.

  • 下载JDK源代码(包括热点)并检查`hotspot/src/share/vm/runtime/globals.hpp`.`CMSPermGenSweepingEnabled`在1.5中出现,在1.6中不存在.此外,1.6版本的`hotspot/src/share/vm/runtime/arguments.cpp`包含用于打印消息的新代码. (28认同)
  • -XX:+ CMSClassUnloadingEnabled和-XX:+ CMSPermGenSweepingEnabled在Java 1.7不可用,见[链接](http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#BehavioralOptions) (14认同)
  • 根据Oracle(参见https://blogs.oracle.com/poonam/entry/about_g1_garbage_collector_permanent)选项`-XX:+ CMSClassUnloadingEnabled`对Java 1.7仍然有效. (8认同)