Grails MiniProfiler プラグインはメモリリークに気をつけましょう。
BuildConfig.groovy
の plugins に
runtime ':profiler:0.4' runtime ':miniprofiler:0.1'
って書くだけで、リクエストごとの発行SQLやレスポンス時間などのプロファイリングを画面上に出してくれる MiniProfiler プラグイン。GGX 2012で話を聞いてから使っていましたが、たいへん盛大にメモリリークを起こしてくれるので、使う際にはそっち方面の注意が必要です。
この MiniProfiler、サーバ側で取得したプロファイル情報を、GSP表示後にAjaxで追加表示する、という動きをします。そのため、Ajaxで表示するための情報はいずこかで参照を持ち続け、メモリリーク(として見えるよう)になるのでしょう。あとプロファイル情報が多いと表示までにすごい時間かかります。
1リクエスト500SQLくらい発行する解析系のシステムに使ってみたら、1リクエストで15MBくらいのメモリリークを起こしていました(おそらく発行SQL数に比例する)。MiniProfiler が有効な状態で負荷試験をしたら、あっという間にメモリを喰い潰して常にFullGCが走り続けて応答がなくなる、という状況に陥るため、不要になったら必ず BuildConfig.groovy
から消しましょうね。
if (Environment.current == Environment.DEVELOPMENT) { runtime ':profiler:0.4' runtime ':miniprofiler:0.1' }
とかやって development 環境でだけ動作するようにしてみたけど、 run-war
(production環境)でもメモリリークが止まらなかったのが気になりました(少なくとも削除したら平和になった)。