通常对于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类呢?
答案 0 :(得分:2)
这是GC的标准行为,与CMS算法无关。 GC正在卸载不再使用的类对象。
虽然第一个日志片段显示与反射实现相关的类对象已卸载,但第二个日志片段指的是正在运行的应用程序中的常规类。 GC确实将两种类对象都视为相同。
请检查您的JVM版本,然后在CMS期间使用-XX:+CMSClassUnloadingEnabled
(或-XX:-CMSClassUnloadingEnabled
)查看是否要禁用/启用类卸载:
有关ClassUnloading的更多信息: