通常对于 CMS,我会看到以下标准输出
[Unloading class sun.reflect.GeneratedMethodAccessorXXX] [Unloading class sun.reflect.GeneratedConstructorAccessorXXXX] [Unloading class sun.reflect.GeneratedSerializationConstructorAccessorXXX] [Unloading class sun.reflect.GeneratedSerializationConstructorAccessorXXX] [Unloading class sun.reflect.GeneratedSerializationConstructorAccessorXXX]
但我也注意到其中有以下内容
[Unloading class Customer_datasetXXXXX] – 280+ occurrence in log
[Unloading class Item_XXXXXX] – 220+ occurrence in log
[Unloading class Receipt_XXXXX] – 30+ occurrence in log
[Unloading class Foo_XXXXX] – 190 occurrence in log
*XXXXX 只是随机数。
请问什么最有可能导致上述情况,这是否正常?
我不明白为什么类对象出现那么多?类是模板,对象是类的实例。那么为什么我会多次出现 Foo 类被卸载的情况呢?
最佳答案
这是 GC 的标准行为,与具体的 CMS 算法无关。 GC 正在卸载不再使用的类对象。
虽然第一个日志片段显示与反射实现相关的类对象已卸载,但第二个日志片段引用了正在运行的应用程序中的常规类。 GC 确实同等对待这两种类型的类对象。
请检查您的 JVM 版本,然后查看是否要使用 -XX:+CMSClassUnloadingEnabled
(或 -XX:-CMSClassUnloadingEnabled
)禁用/启用类卸载CMS 期间:
- 查看此错误:JDK-8000325 : Change default for CMSClassUnloadingEnabled to true ,
- CMSClassUnloadingEnabled at Redfin .
有关 ClassUnloading 的更多信息:
关于java - 并发标记清除 (CMS) 卸载类中的对象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21248645/