たぷつきません

おなかがでてきた。もうたぷついてるやん。

解放されない リフレクションクラス 2

 どんぴしゃ!犯人確保できました。ognl.OgnlRuntimeが、リフレクションメソッドをクラスごとに永久にキャッシュしているのが問題でした。OGNLは「クラスはアンロードされるもの」という前提では設計されていないのです。
 ちょっと待てよ、ということは…TapestryはOGNLとの組み合わせが前提であるにも関わらずTapestryとOGNLは相性がよくない ということになります。ハワードさんは気づいているのかな。コミュニケーションとりたいけど英語できない。
 使用方法を限定することでパーマネント領域への圧迫はさけられるのですが、それはJVMを落とさずに、.htmlや.pageを修正して、リセットサービスをかけてはならない。ということになります。デザインと実装の分離をしたにも関わらず、コンテンツの入れ替えがサーバー止めないとできないというのは、少なくとも私の抱えている案件では致命的です。
 結局、OgnlRuntimeクラスにパッチをあてて対処することにしました。独自のHashTableもどきで作られているClassCacheという内部クラスを、WeakHashMapを使うように修正しました。キーとなっていたClassが消滅すれば自動的にEntryも消えるという算段です。ローカルでのストレスツールを掛けたテストでは効果があったようです。今日、本番機にアップすることになります。今後のためにここからダウンロードできるようにしておきます。*1

*1:あらら、どこかいっちゃった。URLも消えててもう分からないや

解放されない リフレクションクラス 3

 WeakHashMapで解決したというのは、見間違い、勘違い、気の迷いでした。JavaDocにある、

実装上の注意: WeakHashMap 内の値オブジェクトは、通常の強参照によって保持されます。このため、値のオブジェクトが直接的にも間接的にも強くそれ自体のキーを参照しないようにしてください。そうすれば、キーが破棄されないようになります。値のオブジェクトが WeakHashMap 自体を介してそのキーを間接的に参照するようにしてください。つまり、値のオブジェクトはほかのキーオブジェクトを必ず参照し、その関連付けられている値のオブジェクトが今度は最初の値のオブジェクトのキーを必ず参照します。この問題については今後のリリースで対処する予定です。

 …が、該当していたようです。仕方ないのである特定のパターンはキャッシュに登録しないように修正するようにしようかと思います。うーん格好悪い。orz
 圓尾さんが、ReferenceMapというapache.commons.collectionのを紹介してくれたので試してみたが、Ognlのライブラリ自体がなんでもかんでも消えてしまうのはまずい実装になっていたので使えずじまい。残念。でもWeakHashMapの弱点を補っているのでどこかで役立ちそう。