当前位置: 首页 > 面试题库 >

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

诸葛阳成
2023-03-14
问题内容

我在某处读到,使用如下所示的类实例不是一个好主意,因为它们可能会导致内存泄漏。有人可以告诉我这是否是有效的声明?还是他们用这种方式有问题吗?

Map<Class<?>,String> classToInstance = new HashMap();

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

问题答案:

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

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

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

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

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

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

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



 类似资料:
  • 这里有些给使用和编写 Ansible playbook 的贴士. 你能在我们的 ansible-example repository.找到展示这些最佳实践的 playbook 样例.(注意: 这些示例用的也许不是最新版的中所有特性,但它们仍旧是极佳的参考.) Topics 最佳实践 接下来的章节将向你展示一种组织 playbook 内容方式. 你对 Ansible 的使用应该符合你的需求而不是我们

  • 处理后台任务与常规调用方法有很大的不同。本指南旨在帮助让您的后台任务平稳有效地运行。本文基于 这篇博客文章。 使任务参数小而简单 方法(任务)在调用之前会被序列化。使用 TypeConverter 类将参数转换为 JSON 字符串。如果您有复杂的实体和 / 或大对象; 包括数组,最好将它们放入数据库,然后只将其标识 (id) 传递给后台任务。 错误例子: public void Method(En

  • VR设计 VR设计不同于平面体验设计。作为一种新的媒介,有新的最佳实践需要遵循,特别是保持用户的舒适性和存在性。这在如下指南中已经写得很透彻了: Oculus VR最佳实践 Leap Motion VR最佳实践指南 一些值得注意的事情: 公共的金科玉律是永远不要意外地把相机控制权从用户手中剥夺。 单位(比如对于位置)应该考虑使用米(m)。这是因为WebVR API以米为单位返回姿势数据,进而传送给

  • 本章文档将阐述一些使用herosphp开发一些常用模块的一些比较好的实践。 未完待续。。。

  • 适当的使用vuex 能不用就不用。 能用就用。 不要为了使用而使用,一个小方法里面有5个设计模式。 不要过度使用CSS框架 因为CSS框架一般会大幅度增加文件体积。 例如 bootstrap, ele.me前端框架。 这个在低端安卓机上影响显著。 使用CDN来存放js, css, 和图片文件。 灵活使用第三方Vue 插件 例如: 轮播图, 表单验证等等。这些轮子都是现成的。 前端逻辑务必简单 能在

  • 这是 Martin Zinkevich (Google) 在 NIPS 2016 Workshop 分享的谷歌机器学习最佳实践翻译版,PDF 全文见 Rules of Machine Learning: Best Practices for ML Engineering。 机器学习产品所要面对的难题是工程问题(而不是 ML 算法),所以在做机器学习时要遵循跟其他产品类似的工程原则。 术语 实例(