私の会社では、その機能とプロジェクトでの使いやすさから Rythm を使用しています。私たちのプロジェクトでは、いくつかの電子メールを送信しています (1 日に 1000 ~ 2000 通の電子メール)。電子メール テンプレートは、動的構文 (Java コード) を使用した Rythm テンプレートです。パフォーマンスは問題ないようで、統合テストに合格しました。
それでも、3 ~ 4 日後にメモリ リークが発生するいくつかのメモリの問題を実験しました。プロファイリングでは、Spring の ClassLoader や BeanFactory よりも、Rythm がヒープの最大のオブジェクトであることがわかりました (私たちのプロファイリングは約 1 日です)。
ヒープ ツール アナライザーを使用して、RythmEngineとTemplateClassManagerが最大のオブジェクトであることを確認しました。
(Instance) - (retained size bytes)
org.rythmengine.RythmEngine#1 - 10,192,894
org.rythmengine.internal.compiler.TemplateClassManager#1 - 9,223,065
org.springframework.boot.loader.LaunchedURLClassLoader#1 - 6,975,661
java.util.Vector#89 - 6,378,290
java.lang.Object[]#7549 - 6,378,254
org.springframework.beans.factory.support.DefaultListableBeanFactory#1 - 3,741,643
......
ヒープ アナライザー ツールから、これらのオブジェクトは大きなものであることがわかり、時間の経過とともに増加しているように見えます。
そしてGCルート。
メモリ プールに関して: Par Eden は問題ないようで、CMS Old Generation は増加しないか、少なくともゆっくりと (一部の主要な GC の後でも、メモリが解放されているようです)。ヒープ メモリは問題ないように見えますが (テストとプロファイリングは約 1 日です)、本番環境では最大ヒープに達した後、ゆっくりと増加します。
誰かがこの機能を実験したか (rythm を使用し、数日後にメモリ リークが発生したか)、または実稼働環境で rythm を使用してパフォーマンスを向上させる方法のベスト プラクティスを教えてください。または、深さのメモリリークに対処する方法についてのアイデアは歓迎されます。
重要な注意[2015 年 9 月 30 日] :テンプレート エンジンとして Rythm から FreeMarker に変更しました。 (監視システムが反映しているように)メモリはより安定しており、最大メモリ(-Xmx1024) の約 20% です。詳細は今週中にお知らせします。しかし、Rythm にはいくつかのメモリの問題があり、数日後にメモリ リークが発生する可能性があるようです。
重要な注意[2015 年 6 月 10 日] : 数日間の集中的な監視の後、FreeMarker をテンプレート エンジンとして使用してメモリが安定していることを確認しました。製品の Rythm のすべての依存関係を削除しました。これは、調査によると、数日後 (この場合は 2 日) にヒープの OOME が発生する潜在的なメモリ リークの問題が解決されていないことが反映されているためです。問題はクローズされました。