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