java - 并发标记清除 (CMS) 卸载类中的对象类

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

通常对于 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 期间:

有关 ClassUnloading 的更多信息:

关于java - 并发标记清除 (CMS) 卸载类中的对象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21248645/

相关文章:

java - 如何使用反射从另一个项目访问类内部的枚举?

java - 为什么 Tomcat 使用反射来实现 Catalina 实例化

Java内存不足错误: GC overhead limit exceeded when processing large text file - cant figure out how to improve performance

java - 如何创建属于接口(interface)的实例并实现它

java - 未调用 RecyclerView 重写方法并且 getItemCount 始终返回 0

具有数组参数和任意元素类型的 C# FieldInfo.SetValue

java - 为什么我在使用 G1GC 时会变高 `Ref Proc` 次

java - 我使用 CardLayout 得到 NullPointerException

java - 在 Java 中显示一张笑脸

java - 为什么老年代的 gc 比年轻代的 gc 花费的时间更长