2010-05-14 61 views
22

任何人都可以解释为什么在运行时在输出控制台中出现以下行:“卸载类”消息的含义

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

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

程序运行具有以下PARAMS:

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

有足够的空间在堆和PermGen的。

回答

17

这些类保持为softreferences,它们总是符合GC要求。 GC本身不是只有在达到最大内存时运行,它也会在有空间时运行,如果您了解我的意思。

这些类通过使用反射来访问字段和调用方法的序列化API的“底层”。


更新:作为记录类卸载到stdout,而不是作为-Xloggc指定的路径,一直存在一个bug报告,正是这个问题:Bug ID 6637203。这在4个月前得到了修复。将您的JVM升级到最新版本。

+0

谢谢 - 我明白你的意思了......但为什么这些消息专门指向输出控制台而不是gc日志?他们是否有某种特殊的意义(可能会影响绩效)? – Eleco 2010-05-14 12:30:37

+0

据我所知,它默认是不记录的。只有使用'-verbosegc'参数时才会记录。你如何执行JVM?你(或IDE)使用哪些论点?这应该不会有性能影响。 GC通常只在有空间时运行(即JVM无其他事情)或者在达到最大内存的最后时刻运行。这些日志仅用于非正式/调试目的。 – BalusC 2010-05-14 12:35:41

+0

我编辑了原始问题以包含使用的JVM切换器......我本以为任何与gc有关的消息都会转到gc.log日志文件,但是可能再次清除softreferences是一种特殊情况。 – Eleco 2010-05-14 12:45:51