【问题标题】:Will using class.forname multiple times cause memory leak? (running inside tomcat)多次使用 class.forname 会导致内存泄漏吗? (在tomcat中运行)
【发布时间】:2012-04-20 10:32:47
【问题描述】:

1) 如果我使用下面的 Class.forName() 被多次调用,会不会导致内存泄漏?

Class.forName("MyClass") 

2) 或者,tomcat 的 WebAppClassLoader 是否会检查 "MyClass" 是否已经加载并使用缓存的实例。

3) 如果问题 (2) 的答案是“否”,那么如果我打开 PermGen 扫描并设置相关的 jvm 参数,之前加载的类是否会被垃圾收集。

如果我想避免重新加载类,使用类实例缓存的最佳方法是什么。我可以将类实例存储为 HashMap

【问题讨论】:

  • 我不认为它应该泄漏内存,只要它首先是从同一个类加载器加载的。此外,ClassLoader 也随着时间的推移而变化听起来不太可能。

标签: java memory-leaks classloader


【解决方案1】:

1) 不,一个类定义只被任何给定的类加载器加载一次。之后,它被保存在内存中(在 PermGen 空间中)并在对该类的后续引用中重用,直到类加载器存在。这与类的引用方式无关:通过Class.forNameClassLoader.loadClass 或其他方式。

同样的类定义可以多次加载到不同的类加载器中(导致内存中有多个类标记对象)。这些算作完全不同的类,它们不能相互转换,即使它们是从完全相同的类文件加载的。

2) 是的

3) 不适用

4) 引用的文章提到该类在不同的类加载器中重新加载,因此我在 1) 下的解释适用。

【讨论】:

  • 我想这将使用相同的类加载器,这将是由 tomcat 提供的这个 Web 应用程序的类加载器。
  • @samarjitsamanta,很可能是的,虽然我不是 Tomcat 专家,所以不要把我的话当作保证:-)
  • 是的,第四个问题的答案对我来说有点愚蠢,它混淆了类加载器和类实例:) 我意识到了这一点并删除了不相关的问题。感谢您的快速回答。
【解决方案2】:

来自文档:

返回与具有给定字符串名称的类或接口关联的 Class 对象。

我没有看到应该再次加载该类的迹象。它只是返回它,表明多次调用是安全的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2021-03-23
    • 2021-09-25
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多