[mayaa-user:998] Re: SpecificationCacheのデータサイズを節約したい

Susumu ISHIGAMI [E-MAIL ADDRESS DELETED]
2014年 1月 25日 (土) 12:20:01 JST


石上です。

素早いご回答ありがとうございます。そうですよね。難しいですよね。。。
SpecificationCacheの内部実装を読ませていただきました。

ReferSpecificationの
getSpecificationが呼ばれると_survivingCountが0に初期化
requestReleaseが呼ばれるごとに_survivingCountが1加算され、
surviveLimitを超えた時に参照が取り除かれる
という実装になっていますので、使用頻度が高いデータは頻繁にgetSpecificationが呼ばれるので
キャッシュは残りやすくなっているのですね。

java.lang.refパッケージについて不勉強で申し訳ないですが
requestReleaseが呼ばれるタイミングがよく分からず、
いわゆるFullGCの回数に依存するのか、YoungGCも含めるのかがいまいちわかりませんでした。
ReferenceQueueを使用して、参照が切れたことを検知しているのはわかったのですが。。。

現状のアルゴリズムにおいて、

・今はあまり使われないキャッシュもOlgGenに格納されていると思われる
・キャッシュの容量を一定になるように管理したい
・あまり使われないキャッシュはYoungGCで消されて欲しい
・頻繁に使われるキャッシュはOldGenに格納されてほしい

という場合は、surviveLimitが5にて、この状態の場合、surviveLimitを減らすべきという認識でよろしいでしょうか。

また、サイズが大きくなってしまうのならば、せめてリソースを管理したい心情がありますので、
例えばフォルダごとに50MBまでというように、グルーピングして最大容量を固定したい場合は
ReferSpecificationをカスタマイズして、requestReleaseを独自実装すれば実現可能なような気がします。
もしこの認識が合っていましたら、現状ReferSpecificationがprivate classのためにできませんので、
こちらをカスタマイズ可能にしていただくことはできませんでしょうか。
(的はずれなことを言っていたら申し訳ありません)



2014年1月22日 23:50 suga <ko.suga @ gmail.com>:
> suga です。
>
> 難しいですね……。
>
> 不要なprocessorを削るというのはすでにされているようなので、
> あとは共通パターンをcomponentにすることで数を減らす、
> 物によっては独自processor(orカスタムタグ)を作ることでサイズを小さくできるものもあるかもしれません。
>
> ファイルサイズは、現在は単純な serialize なので Zip してしまえば小さくなるでしょうけど、
> その分 serialize / deserialize は遅く重くなるのでトレードオフですね。
>
>
> 早めにメモリから解放されるようにするには、engineのパラメータ surviveLimit を小さくする方法があります。
> これはGC の解放命令を何回無視するかという回数なので heap サイズとは直接関係ありませんが、
> 空き heap を優先させるなら小さくしてみて効果があるか試すのも手でしょう。
> デフォルトは 5 です。
>
> 処理は
> org.seasar.mayaa.impl.engine.SpecificationCache
> にあります。
>
>
> --
> suga ( ko.suga @ gmail.com )
>
>
> 2014/1/22 Susumu ISHIGAMI <susumu.ishigami @ gmail.com>:
>> 石上です。
>>
>> 唐突な相談で申し訳ありません。
>>
>> Mayaaを使用していると、
>> org.seasar.mayaa.impl.engine.SpecificationCache
>> というクラスにテンプレートのキャッシュが蓄積されていきます。
>>
>> ヒープダンプを解析してみると、ここに蓄積されるデータ量は
>> 数百KBのテンプレートファイルでも、1ファイル分で10MB以上になることがあり、
>> 大量のテンプレートを使用しているWebサイトでは、
>> GB単位になってしまいます。。。
>>
>> SoftReferenceを使用しているのでOutOfMemoryErrorになることはなく、
>> さらにアンロードされたとしてもpageSerialize機能が有効であれば、
>> .mayaaSpecCacheディレクトリにシリアライズされたデータが保存されているので、
>> 再ロードするときのコストが最小限に押さえられます。
>>
>> 大変良く作られていますねw
>>
>> では、あるのですが、やはりファイルからロードするとメモリにキャッシュされているよりは大分遅いですし、
>> ヒープのOldGenの大半を専有してしまうので、なるべく減らしたいのが心情です。。。
>> ヒープサイズが慢性的に多すぎるため、GCの発生頻度なども上がってしまい、システムの安定性を低下させてしまいますので、
>> 消費量が少ないなら少ないように抑えたく思います。
>>
>> そこで、なんとかキャッシュの容量を節約する方法はありませんでしょうか。
>> それが無理なら、ヒープの割上げ上限(出来れば空きヒープの%指定)が設定できると良いかと思います。
>>
>> 今のところ、キャッシュの容量は単にテンプレートファイルのサイズに依存するのではなく、
>> テンプレートでprocessorと紐付いているほど大きくなることを把握していますので、
>> 「なるべく不要なm:id属性は記述しない」
>> 「長期的に使わない箇所はコメントアウトではなくてテンプレートから消してしまう」
>> とテンプレート作成者に伝えています。
>> _______________________________________________
>> mayaa-user mailing list
>> mayaa-user @ ml.seasar.org
>> https://ml.seasar.org/mailman/listinfo/mayaa-user
> _______________________________________________
> mayaa-user mailing list
> mayaa-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/mayaa-user



-- 
Susumu ISHIGAMI
susumu.ishigami @ gmail.com


mayaa-user メーリングリストの案内