“卸载类”消息的含义

任何人都可以解释为什么下面的行在运行时出现在输出控制台中?

(一个可能的答案是完全permGen,但这可以排除,因为该程序仅使用PermGen中可用的max100MB中的24MB)

[卸载类sun.reflect.GeneratedSerializationConstructorAccessor28]
[卸载类sun.reflect.GeneratedSerializationConstructorAccessor14]
[卸载类sun.reflect.GeneratedSerializationConstructorAccessor4]
[卸载类sun.reflect.GeneratedMethodAccessor5]
[卸载类sun.reflect.GeneratedSerializationConstructorAccessor38]
[卸载类sun.reflect.GeneratedSerializationConstructorAccessor36]
[卸载类sun.reflect.GeneratedSerializationConstructorAccessor22]
[卸载类sun.reflect.GeneratedSerializationConstructorAccessor8]
[卸载类sun.reflect.GeneratedSerializationConstructorAccessor39]
[卸载类sun.reflect.GeneratedSerializationConstructorAccessor16]
[卸载类sun.reflect.GeneratedSerializationConstructorAccessor2]
[卸载类sun.reflect.GeneratedConstructorAccessor1]

该程序使用以下参数运行:

-Xmx160M
-XX:MaxPermSize参数= 96M
-XX:PermSize = 96M
-XX:+ UseConcMarkSweepGC
-XX:+ UseParNewGC
-XX:+ PrintGCTaskTimeStamps
-XX:+ PrintHeapAtGC
-XX:+ PrintTenuringDistribution
-XX:+ PrintGCDetails
-XX:+ PrintGCDateStamps
-XX:+ PrintGCTimeStamps
-verbose:GC
-Xloggc:/logs/gc.log

堆中和permGen中有足够的空间。

这些类作为软引用保留 ,始终符合GC的条件。 GC本身不会在达到最大内存时运行,如果你理解我的意思,它也会在有空间时运行。

顺便说一下,这些类是使用Serialization API的“引擎盖”,它使用reflection来访问字段并调用方法。


更新 :关于将类卸载记录到stdout而不是-Xloggc指定的路径,已经出现了针对此问题的错误报告 : 错误ID 6637203 。 4个月后修复了这个问题。 将JVM升级到最新版本。