是的,您必须要小心!例如,如果您的代码在Web容器中运行,并且习惯于热部署Web应用程序,则对单个类对象的保留引用可能会导致大量Permgen内存泄漏。
本文详细解释了该问题。简而言之,问题在于每个类都包含对其类加载器的引用,而每个类加载器均包含对其已加载的每个类的引用。因此,如果一个班级可以到达,那么所有的人都可以。
要注意的另一件事是,如果重新加载了用作键的类之一,则:
- 该类的新旧版本将不相等。
- 查找新类将首先给出“未命中”。
- 在将新类添加到地图之后,现在将为该类的不同版本提供两个不同的地图条目。
- 即使该类的两个版本之间没有 代码 差异,这也适用。它们之所以会有所不同,仅仅是因为它们是由不同的类加载器加载的。
从Java 8-Permgen已删除。您认为在任何情况下都可以将Class实例用作HashMap键吗?
请注意,您仍然会发生内存泄漏。HashMap(键或值)和(至少)其他动态加载的类中使用的任何动态加载的类都将保持可访问状态。这意味着GC将无法卸载/删除它们。
以前的permgen泄漏现在变成了普通的堆和元空间存储泄漏。(元数据是保留类的类描述符和代码对象的地方。)



