При загрузке KeyStore в Java 7 просачивается Classloader.
Я подтвердил это, используя функцию "Найти утечки" в Tomcat 7.0.47 и classloader-leak-prevention. Вот тестовый код, webapp с утечкой в @Configuration и webapp с утечкой в @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 Bit. OpenJDKs являются последними неофициальные сборки alexkasko на GitHub.
Есть ли у кого-нибудь идея, что может вызвать утечку Classloader? Я попытался использовать кучу кучи и назвал "самый короткий путь к GC root", но это не дало никаких результатов.