java - 在 Java 7 中加载 KeyStore 会泄漏类加载器

标签 java memory-leaks classloader

在 Java 7 中加载 KeyStore 时,类加载器会泄漏。

我已经使用 Tomcat 7.0.47 和 classloader-leak-prevention 中的“查找泄漏”功能确认了这一点.这是 test code , webapp with the leak in @Configurationwebapp 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/

相关文章:

java - SQLite 连接对象泄露 - Android

java - 弱引用持有的类加载器?

java - 如何在 JBOSS EAP6.4 的自定义模块后使用 Spring Boot 应用程序使用自定义 module.xml 并进行部署

java - 异常 : java. lang.NoClassDefFoundError: org/apache/log4j/PropertyConfigurator

Java 类加载器更改

java - Firestore 回收器适配器 - 滚动后项目消失

java - 如何在 Kotlin 中使用 Lambda handleHeavyContent()

mysql - Scrapy selenium 中间件内存泄漏

java - 使用 JOOQ 执行 Firebird 存储过程

java - JPA 查询返回代理实体