并发标记扫描(CMS)卸载类中的对象类

时间:2014-01-21 03:36:12

标签: java reflection garbage-collection jvm concurrent-mark-sweep

通常对于CMS我会看到以下标准输出

  

[卸载类sun.reflect.GeneratedMethodAccessorXXX] [卸载   class sun.reflect.GeneratedConstructorAccessorXXXX] [卸载类   sun.reflect.GeneratedSerializationConstructorAccessorXXX] [正在卸载   class sun.reflect.GeneratedSerializationConstructorAccessorXXX]   [卸载课程   sun.reflect.GeneratedSerializationConstructorAccessorXXX]

但我也注意到以下内容

  

[卸载类Customer_datasetXXXXX] - 在日志中出现280+

     

[卸载类Item_XXXXXX] - 在日志中出现220+

     

[卸载类Receipt_XXXXX] - 日志中出现30+

     

[卸载类Foo_XXXXX] - 在日志中发生190次

* XXXXX只是随机数。

我可能知道最有可能导致上述情况的是什么,这是正常的吗?

我不明白为什么类对象出现这么多?类是模板,对象是类的实例。那么为什么我要卸载这么多Foo类呢?

1 个答案:

答案 0 :(得分:2)

这是GC的标准行为,与CMS算法无关。 GC正在卸载不再使用的类对象。

虽然第一个日志片段显示与反射实现相关的类对象已卸载,但第二个日志片段指的是正在运行的应用程序中的常规类。 GC确实将两种类对象都视为相同。

请检查您的JVM版本,然后在CMS期间使用-XX:+CMSClassUnloadingEnabled(或-XX:-CMSClassUnloadingEnabled)查看是否要禁用/启用类卸载:

有关ClassUnloading的更多信息: