多次使用class.forname会导致内存泄漏吗? (在tomcat中运行)

时间:2012-04-20 10:32:47

标签: java memory-leaks classloader

1)如果我多次调用Class.forName(),会导致内存泄漏吗?

Class.forName("MyClass") 

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

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

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

2 个答案:

答案 0 :(得分:9)

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

同一个类定义可以多次加载到不同的类加载器中(导致内存中有多个类标记对象)。它们被视为完全不同的类,即使它们是从完全相同的类文件加载的,也无法相互转换。

2)是的

3)N / A

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

答案 1 :(得分:0)

来自文档:

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

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