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

Java 并发标记扫描(CMS)卸载类中的对象类,java,reflection,garbage-collection,jvm,concurrent-mark-sweep,Java,Reflection,Garbage Collection,Jvm,Concurrent Mark Sweep,通常对于CMS,我会看到以下标准 [卸载类sun.reflect.GeneratedMethodAccessorXXX][卸载 类sun.reflect.GeneratedConstructorAccessorXXXX][卸载类 sun.reflect.GeneratedSerializationConstructorAccessorXXX][1 类sun.reflect.GeneratedSerializationConstructorAccessorXXX] [卸货级别] sun.refle

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

[卸载类sun.reflect.GeneratedMethodAccessorXXX][卸载 类sun.reflect.GeneratedConstructorAccessorXXXX][卸载类 sun.reflect.GeneratedSerializationConstructorAccessorXXX][1 类sun.reflect.GeneratedSerializationConstructorAccessorXXX] [卸货级别] sun.reflect.GeneratedSerializationConstructorAccessorXXX]

但我也注意到了以下几点

[卸载类客户_数据集XXXXX]–日志中出现280多次

[卸载类项目uxxxxxx]–日志中出现220+次

[卸货类收据\uuxxxxx]–日志中出现30多次

[卸载类Foo_uxxxxx]–日志中出现190次

*XXXXX只是随机数

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


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

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

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

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

  • 看到这个bug:
有关类卸载的详细信息:


在这个问题上有什么帮助吗?但我不明白为什么类对象会出现这么多?类是模板,对象是类的实例。那么为什么要卸载这么多的Foo类呢?后缀XXXX是什么意思,该部分是静态的还是每次Foo发生时都会发生变化?这些可能是动态生成的类,因此可能有许多Foo_10;的实例。您需要进入源代码并查看Foo_XXXX的实例化位置。它们是随机的否。是否愿意给出一些动态生成与正常实例化的示例?运行时生成的代码示例可以是JSP,其中Java代码可以在运行时从JSP模板生成。另一个例子是代理模式,其中生成了
com.sun.Proxy.$ProxyXX
类的许多实例,用整数替换“XX”。可能还有自定义类工厂在运行时创建类,这可能是您的情况。