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:自己責任でご確認下さい。