在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