5

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

Class.forName("MyClass") 

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

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

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

4

2 回答 2

10

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

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

2) 是的

3) 不适用

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

于 2012-04-20T10:38:55.070 回答
0

从文档中:

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

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

于 2012-04-20T10:37:53.943 回答