任何人都可以解释为什么下面的行在运行时出现在输出控制台中?
(一个可能的答案是完全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中有足够的空间。
答案 0 :(得分:18)
这些类保持为softreferences,它们始终符合GC的条件。当达到最大内存时,GC本身不会 运行,如果你理解我的意思,它也会在有空间的情况下运行。
顺序API的“引擎盖”使用了这些类,它使用反射来访问字段并调用方法。
更新:关于将类卸载记录到stdout而不是-Xloggc
中指定的路径,已经出现了针对此问题的错误报告:Bug ID 6637203。 4个月后修复了这个问题。将JVM升级到最新版本。