Javaのメモリ消費に関して興味深い問題があります。Javaアプリケーションを呼び出すネイティブC++アプリケーションがあります。
アプリケーションは基本的にいくつかの言語翻訳を行い、いくつかのXMLを解析し、ネットワーク要求に応答します。アプリケーションの状態のほとんどは保持する必要がないため、文字列引数を取り込んで文字列の結果を返すメソッドでいっぱいです。
このアプリケーションは時間とともにますます多くのメモリを使用し続け、2 GB近くのメモリを使用し始める時期が来ています。これにより、一部のハッシュテーブルまたは静的変数のどこかにリークがあると思われます。よく調べてみると、漏れは見つかりませんでした。ある期間のヒープダンプを比較すると、char[]オブジェクトとStringオブジェクトが大量のメモリを消費していることがわかります。
ただし、これらのchar []、文字列を調べると、GCルートがないことがわかります。これは、リークの原因ではないことを意味します。それらはヒープの一部であるため、ガベージコレクションを待機していることを意味します。さまざまなツールMAT\VisualVM \ JHatを使用し、そのようなオブジェクトを多数スクロールした後、yourkitの試用版を使用しました。Yourkitは、char []とStringの96%が到達不能であるとすぐにデータを提供します。これは、ダンプを取得した時点で、ヒープ内の文字列の96%がガベージコレクションを待機していたことを意味します。
GCは控えめに実行されていることを理解していますが、VisualVMで確認すると、実際に実行されていることがわかります:-(どうしてかというと、ヒープ上に未使用のオブジェクトが常にたくさんあるのです。
IMOこのアプリケーションは、最初の24時間はそこにとどまりますが、ヒープを増やし続けるよりも、400〜500MBを超えるメモリを使用することはできません:-(
Java1.6.0-25を実行しています。
助けてくれてありがとう。