在Java 7中加载KeyStore会泄漏Classloader

Arl*_*rlo 12 java memory-leaks classloader

在Java 7中加载KeyStore时,类加载器被泄露.

我已经使用Tomcat 7.0.47中的"Find Leaks"功能和classloader-leak-prevention确认了这一点.这是测试代码,带有@Configuration泄漏webapp和带有@Controller泄漏webapp.

基本上这些线为我造成了泄漏:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我删除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 Bit上测试的.OpenJDKs是alexkasko在GitHub上的最新非官方版本.

有谁知道可能导致Classloader泄漏的原因是什么?我尝试使用堆转储并调用"GC根目录的最短路径",但没有返回任何结果.

Arl*_*rlo 2

类加载器不会泄漏。当部署一堆空应用程序并且 PermGen 达到某个阈值时,Tomcat 的 Find Leaks 会停止报告应用程序。因此这是一个误报。