作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在 Java 7 中加载 KeyStore 时,类加载器会泄漏。
我已经使用 Tomcat 7.0.47 和 classloader-leak-prevention 中的“查找泄漏”功能确认了这一点.这是 test code , webapp with the leak in @Configuration和 webapp with the leak in @Controller .
基本上这些线对我来说是导致泄漏的原因:
InputStream is = null;
try {
is = new FileInputStream("./app.truststore");
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(is, "changeit".toCharArray());
} catch (Exception e) {
System.out.println(e);
} finally {
if (is != null) {
is.close();
}
}
如果我删除 KeyStore.load() 一切正常,但这显然不是一个有效的解决方案。
它不适用于 Oracle JDK 1.7u15、u17、u21、u25、u40 和 u45 以及 OpenJDK 1.7u40 和 u45。
它适用于 Oracle JDK 1.6u39、u41、u43 和 45 以及 OpenJDK 1.6.0。
这是在 Microsoft Windows Server 2008 R2 Standard 64 位上测试的。 OpenJDK 是最新的 unofficial builds由 alexkasko 在 GitHub 上发布。
有谁知道可能导致类加载器泄漏的原因是什么?我尝试使用堆转储并调用“到 GC 根的最短路径”,但没有返回任何结果。
最佳答案
类加载器不会泄漏。当部署一堆空应用程序并且 PermGen 达到某个阈值时,Tomcat 的 Find Leaks 将停止报告该应用程序。因此这是一个误报。
关于java - 在 Java 7 中加载 KeyStore 会泄漏类加载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20214382/
我是一名优秀的程序员,十分优秀!