Tomcat7で実行されているJavaWebアプリケーションがあり、メモリリークがあるようです。アプリケーションの平均メモリ使用量は、負荷がかかっているときに時間の経過とともに直線的に増加します(JConsoleを使用して決定)。メモリ使用量がプラトーに達すると、パフォーマンスが大幅に低下します。応答時間は約100msから[300ms、2500ms]になるため、これは実際に実際の問題を引き起こしています。
私のアプリケーションのJConsoleメモリプロファイル:
VisualVMを使用すると、メモリの少なくとも半分が文字配列(つまり、char [])によって使用されており、文字列のほとんど(それぞれ、300,000インスタンスのほぼ同じ数)が次のいずれかであることがわかります。「割り当ての失敗」 、「コピー」、「マイナーGCの終了」、これらはすべてガベージコレクション通知に関連しているようです。私の知る限り、アプリケーションはガベージコレクターをまったく監視していません。VisualVMはこれらの文字列のGCルートを見つけることができないため、これを追跡するのに苦労しています。
メモリアナライザのヒープダンプ:
なぜそのようなメモリ使用量のプラトーになるのか説明することはできませんが、パフォーマンスが低下するとパフォーマンスが低下する理由については理論があります。メモリが断片化されている場合、アプリケーションは、新しい要求を処理するために連続したメモリブロックを割り当てるのに長い時間がかかる可能性があります。
これを組み込みのTomcatサーバーステータスアプリケーションと比較すると、メモリは増加し、で横ばいになりますが、私のアプリケーションのように高い「フロア」には到達しません。また、到達不能なchar[]の数も多くありません。
TomcatサーバーステータスアプリケーションのJConsoleメモリプロファイル:
Tomcatサーバーステータスアプリケーションのメモリアナライザヒープダンプ:
これらの文字列はどこに割り当てることができ、なぜガベージコレクションされないのですか?これに影響を与える可能性のあるTomcatまたはJavaの設定はありますか?これに影響を与える可能性のある特定のパッケージはありますか?