一千萬個為什麽

搜索

使用Class實例作為Map鍵是最佳實踐嗎?

我在某處讀過如下使用類實例並不是一個好主意,因為它們可能會導致內存泄漏。有人可以告訴我,如果這是一個有效的聲明?或者這樣使用它有什麽問題嗎?

Map classToInstance = new HashMap();

classToInstance.put(String.class,"Test obj");

最佳答案

是的,你需要謹慎!例如,如果您的代碼在Web容器中運行,並且您習慣於對Web應用程序進行熱部署,則對單個類對象的保留引用可能會導致嚴重的permgen內存泄漏。

This article explains the problem in detail. But in a nutshell, the problem is that each class contains a reference to its classloader, and each classloader contains references to every class that it has loaded. So if one class is reachable, all of them are.


從Java 8 - Permgen被刪除。您認為在任何情況下都可以將Class實例用作HashMap鍵嗎?

請註意,您仍會有內存泄漏。您的HashMap(鍵或值)和(至少)其他動態加載的類中使用的任何動態加載的類都將保持可訪問狀態。這意味著GC將無法卸載/刪除它們。之前的permgen泄漏現在是普通的堆泄漏。

轉載註明原文: 使用Class實例作為Map鍵是最佳實踐嗎?