栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用Class实例作为Map键是最佳实践吗?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用Class实例作为Map键是最佳实践吗?

是的,您必须要小心!例如,如果您的代码在Web容器中运行,并且习惯于热部署Web应用程序,则对单个类对象的保留引用可能会导致大量Permgen内存泄漏。

本文详细解释了该问题。简而言之,问题在于每个类都包含对其类加载器的引用,而每个类加载器均包含对其已加载的每个类的引用。因此,如果一个班级可以到达,那么所有的人都可以。

要注意的另一件事是,如果重新加载了用作键的类之一,则:

  1. 该类的新旧版本将不相等。
  2. 查找新类将首先给出“未命中”。
  3. 在将新类添加到地图之后,现在将为该类的不同版本提供两个不同的地图条目。
  4. 即使该类的两个版本之间没有 代码 差异,这也适用。它们之所以会有所不同,仅仅是因为它们是由不同的类加载器加载的。

从Java 8-Permgen已删除。您认为在任何情况下都可以将Class实例用作HashMap键吗?

请注意,您仍然会发生内存泄漏。HashMap(键或值)和(至少)其他动态加载的类中使用的任何动态加载的类都将保持可访问状态。这意味着GC将无法卸载/删除它们。

以前的permgen泄漏现在变成了普通的堆和元空间存储泄漏。(元数据是保留类的类描述符和代码对象的地方。)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/609612.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号