好了,沒有人在那裏幫助我,所以這裏我學到了什麼:
終結器線程由FinalizableReferenceQueue(FRQ)開始。 MapMaker中FRQ有一個很難(靜態的)引用。 WebAppClassLoader沒有被垃圾收集,因爲MapMaper仍然是由於硬引用。
下面的代碼解決我的問題:
final Class<?> queueHolderClass =
Class.forName("com.google.inject.internal.util.$MapMaker$QueueHolder");
final Field queueField = queueHolderClass.getDeclaredField("queue");
// make MapMaker.QueueHolder.queue accessible
queueField.setAccessible(true);
// remove the final modifier from MapMaker.QueueHolder.queue
final Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(queueField, queueField.getModifiers() & ~Modifier.FINAL);
// set it to null
queueField.set(null, null);
這裏的違規代碼(com.google.inject.internal.util.MapMaker
):
/** Wrapper class ensures that queue isn't created until it's used. */
private static class QueueHolder {
static final FinalizableReferenceQueue queue = new FinalizableReferenceQueue();
}
這樣做後,終結器線程正常死亡。
以下是此問題的錯誤報告:http://code.google.com/p/google-guice/issues/detail?id=288 – Gili 2012-01-24 01:41:27