【问题标题】:Object classes in concurrent-mark-sweep (CMS) unloading classes并发标记清除 (CMS) 卸载类中的对象类
【发布时间】:2014-01-21 03:36:12
【问题描述】:

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

[卸载类 sun.reflect.GeneratedMethodAccessorXXX] [卸载 class sun.reflect.GeneratedConstructorAccessorXXXX] [卸载类 sun.reflect.GeneratedSerializationConstructorAccessorXXX] [卸载 类 sun.reflect.GeneratedSerializationConstructorAccessorXXX] [卸载类 sun.reflect.GeneratedSerializationConstructorAccessorXXX]

但我也注意到其中的以下内容

[卸载类 Customer_datasetXXXXX] – 日志中出现 280 多次

[卸载类 Item_XXXXXX] – 日志中出现 220 多次

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

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

*XXXXX 只是随机数。

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

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

【问题讨论】:

  • 对这个问题有帮助吗?

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


【解决方案1】:

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

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

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

更多关于 ClassUnloading 的一般信息:

【讨论】:

  • 但我不明白为什么类对象出现这么多?类是模板,对象是类的实例。那么为什么我有这么多的 Foo 类被卸载呢?
  • 后缀 XXXX 是什么意思,该部分是静态的还是每次 Foo 出现都会改变?这些可能是动态生成的类,因此可能有许多 Foo_ 的实例。您需要进入源代码并查看 Foo_XXXX 的实例化位置。
  • 它们是随机的。愿意举一些动态生成与普通实例化的例子吗?
  • 运行时生成的代码示例可以是 JSP,其中 Java 代码可以在运行时从 JSP 模板中生成。另一个例子是代理模式,其中生成了许多com.sun.proxy.$ProxyXX 类的实例,用整数替换“XX”。
  • 可能还有自定义类工厂在运行时创建类,这可能是您的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
  • 2022-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多