1)如果我使用下面的Class.forName()被多次调用,会不会导致内存泄漏?
Class.forName("MyClass")
2)或者,tomcat的WebAppClassLoader是否会检查是否"MyClass"
已经加载并使用缓存的实例。
3) 如果问题 (2) 的答案是“否”,那么如果我打开 PermGen 扫描并设置相关的 jvm 参数,之前加载的类是否会被垃圾收集。
如果我想避免重新加载类,使用类实例缓存的最佳方法是什么。我可以将类实例存储为 HashMap
1)如果我使用下面的Class.forName()被多次调用,会不会导致内存泄漏?
Class.forName("MyClass")
2)或者,tomcat的WebAppClassLoader是否会检查是否"MyClass"
已经加载并使用缓存的实例。
3) 如果问题 (2) 的答案是“否”,那么如果我打开 PermGen 扫描并设置相关的 jvm 参数,之前加载的类是否会被垃圾收集。
如果我想避免重新加载类,使用类实例缓存的最佳方法是什么。我可以将类实例存储为 HashMap
1) 不,一个类定义只被任何给定的类加载器加载一次。之后,它被保存在内存中(在 PermGen 空间中)并在对该类的后续引用中重用,直到类加载器存在。这与类的引用方式无关: viaClass.forName
或ClassLoader.loadClass
其他。
同一个类定义可以多次加载到不同的类加载器中(导致内存中有多个类令牌对象)。这些算作完全不同的类,它们不能相互转换,即使它们是从完全相同的类文件加载的。
2) 是的
3) 不适用
4) 引用的文章提到该类在不同的类加载器中重新加载,因此我在 1) 下的解释适用。
从文档中:
返回与具有给定字符串名称的类或接口关联的 Class 对象。
我没有看到应该再次加载该类的迹象。它只是返回它,表明多次调用是安全的。