在Java 7中加载KeyStore时,类加载器被泄漏。在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是GitHub上alexkasko最新的unofficial builds。
有没有人有一个想法可能导致Classloader泄漏?我尝试使用堆转储并调用“GC根”的最短路径,但返回的结果。
嗨,大家知道,我写了一个Spring MVC测试应用程序,并将您的逻辑添加到应用程序初始化程序。然后,我用plumbr的一个评估版来检测它,它立即检测到一个类加载器泄漏。 JRE和JDK为7.0,运行时为基于Apache Tomcat-7.0.42.A.RELEASE的TC Server 2.9.3。 它报告你的应用程序有一个类加载器泄漏,它可以防止在每次取消部署时卸载5348个类。没有你的代码,应用程序是干净的。仍在寻找原因。 – TechTrip