2016-03-23 5 views
10

Solaris 10で実行されているjavaプロセスは、約200〜300人の同時ユーザーに対応しています。管理者は、プロセスによって使用されるメモリが時間とともに大幅に増加すると報告しています。数日で2GBに達し、決して成長を止めません。Javaプロセスメモリが無限に増加しています。メモリーリーク?

ヒープをダンプし、Eclipse Memory Profilerを使用して解析しましたが、そこから普通のものを見ることはできませんでした。ヒープサイズは非常に小さかった。

メモリ統計ログを追加した後、管理者が使用する「トップ」ユーティリティによって報告されたメモリ使用量と、MemoryMXBeanおよびランタイムライブラリによって報告された使用量との間に不一致が見つかりました。

ここには両方の出力があります。

Memory usage information 

From the Runtime library 
Free memory: 381MB 
Allocated memory: 74MB 
Max memory: 456MB 
Total free memory: 381MB 

From the MemoryMXBean library. 
Heap Committed: 136MB 
Heap Init: 64MB 
Heap Used: 74MB 
Heap Max: 456MB 
Non Heap Committed: 73MB 
Non Heap Init: 4MB 
Non Heap Used: 72MB 

Current idle threads: 4 
Current total threads: 13 
Current busy threads: 9 
Current queue size: 0 
Max threads: 200 
Min threads: 8 
Idle Timeout: 60000 

    PID USERNAME NLWP PRI NICE SIZE RES STATE TIME CPU COMMAND 
99802 axuser 115 59 0 2037M 1471M sleep 503:46 0.14% java 

これはどのようにすることができますか? topコマンドは、はるかに多くの使用法を報告します。私は、RESがヒープ+非ヒープに近いはずだと予想していました。

のpmap -xは、しかし、ヒープメモリのほとんどを報告します。

Address  Kbytes  RSS  Anon  Locked Mode Mapped File 
*102000   56   56   56  - rwx---- [ heap ] 
*110000  3008  3008  2752  - rwx---- [ heap ] 
*400000 1622016 1621056 1167568  - rwx---- [ heap ] 
*000000  45056  45056  45056  - rw----- [ anon ] 

誰もがこの上でいくつかの光を当てるていただけますか?私は完全に失われています。

ありがとうございました。

更新

これは、Linux上の問題ではありません。

また、Peter Lawreyの回答に基づいて、pmapによって報告される「ヒープ」は、Javaヒープではなくネイティブヒープです。

+5

このアプリケーションで使用されているネイティブライブラリはありますか? – JimmyJames

+6

pmapによって報告される「ヒープ」は、Javaヒープではなくネイティブヒープになる可能性があります。ネイティブスペースでアプリケーションが使用できるリソース –

+0

確かに、わからない。アプリケーション処理REST呼び出し内にJettyサーバーがあります。呼び出しに応じて、ojdbcを使用してデータベースに対して選択/挿入/削除を実行するか、I/Oを実行することがあります。だから私の推測は、はい、私たちはネイティブライブラリを使用していますが、私は彼らが何であるか確実ではありませんか?私が参照できるネイティブJavaライブラリのリストはありますか? –

答えて

1

ガベージコレクションされた環境では、未使用のポインタを保持すると「リークが発生しない」ことになり、GCがそのジョブを実行できなくなります。 は、誤ってポインタを置いておくのが簡単です。

一般的な原因はハッシュテーブルです。もう1つは、 (再利用インデックスを0に設定することによって)論理的にクリアされた配列またはベクトルですが、実際の の内容(使用インデックスの上)はまだ何かを指しています。

+0

ヒープ上のリークの原因となる記述はありませんか? –

+3

元の質問は、ヒープサイズが(いくらか)安定していることを言います。それは増加している "ネイティブ"メモリサイズです。これは、Javaオブジェクトに関連しないリークを私に示唆しています。ハッシュテーブルは問題ではありません。ここでは、多くのライブJavaオブジェクトを表示するヒープダンプに表示されます。 –

+0

良い点。漏れた漏れたリソースが原因である可能性が高いオープンされているがクローズされていないファイルのようなものスレッドは開始されましたが終了しません。クラスなどの一部のタイプのストレージは、まったく収集できません。 – ddyer