URL越しにJarファイルを見ると、メモリリークする?

今日も元気にGeronimoのコードを泳いでいると、
何やら妙なコードを発見。


GeronimoEnvironmentってクラス。これしか処理が書いて無い。

// Setting useCaches to false avoids a memory leak of URLJarFile instances
// It's a workaround for a Sun bug (see bug id 4167874). Otherwise, 
// URLJarFiles will never be garbage collected. o.a.g.deployment.util.DeploymentUtil.readAll() 
// causes URLJarFiles to be created
try {
    // Protocol/file shouldn't matter. 
    // As long as we don't get an input/output stream, no operations should occur...
    new URL("http://a").openConnection().setDefaultUseCaches(false);
}
catch (IOException ioe) {
    // Can't Log this. Should we send to STDOUT/STDERR?
}

setDefaultUseCachesしないと、メモリリークすんの?マジで?え?常識?
知りませんでした…orz


と、言う訳で、当該バグをチェックしてみたり。Bug ID:4167874
えぇぇぇ?In progress, bug??


ふむ。sun.net.www.protocol.jar.JarFileFactoryと言う奴がURL毎に、
JarFileをキャッシュしてるみたいだねぇ。*1
只、windows版j2sdk_1_4_10で、ココに書いてあるコードを実行してみたけど、再現せなんだ。


まぁ、どちらにしろjava.net.URLConnectionは、
useCachesがデフォルトtrueだし、
JarFileFactoryはガーベジコレクト対象にならないような方法で、
URLとJarFileをキャッシュするみたいなので、
URLConnectionのサブクラスを扱う時には、要注意って事やね。


Geronimoみたいに凄い勢いで、
Jarファイルを開いたり閉じたり、作ったり消したりする時には、
こういうのってやっぱ問題になるんだろうねぇ。
まぁ、APサーバ以外では、この回避措置はイラネェって事で。

*1:自己責任でご確認下さい。