3

Eclipseでテストできないサーブレットを作成しています。サーバーで実行する必要があります。メモリプロファイリングを行い、リークを特定したいと思います。したがって、現在のメモリ使用量を教えてくれるデバッグステートメントを作成する必要があると思います。誰かがこれを行う方法やJDKのどのクラスがこれを行うかについての良い参考資料を教えてもらえますか?

「EclipseMAT」は使用できませんのでご注意ください。

4

5 に答える 5

7

jdk jvisualvmの組み込みツールを使用できませんか?

于 2011-03-18T07:21:33.443 に答える
2

JConsoleがあなたを救います!

于 2011-03-18T07:24:45.697 に答える
1

したがって、現在のメモリ使用量を教えてくれるデバッグ ステートメントを書く必要があると思います。

ガベージ コレクターを使用すると、カウントを確認するだけでメモリ リークを見つけるのがやや難しくなるため、あまり役に立たない可能性があります (gc がいつ実行され、実際に何を収集するのかはよくわかりません。収集されない場合もあります)。収集可能なものすべて)。そのため、いくつかのメモリ スナップショットを作成して分析する必要がある場合があります。つまり、どのオブジェクト (またはどのタイプのオブジェクト) が収集されていないかを確認し、その結果、より多くのインスタンスが作成されます。

これについては、推奨ツール (JVisualVM、JConsole) を参照してください。

プログラム内からメモリ使用量の情報を取得したい場合は、java.lang.managementパッケージのクラスを試してください。

于 2011-03-18T07:30:57.920 に答える
1

アプリケーション メモリのプロファイリングとリークの追跡は困難な作業であり、単純なデバッグ ステートメントで誤解を招くことは言うまでもありません。プロセスにリモートで接続するツールを使用できない場合は、hprofを使用することをお勧めします。また、こちらのトラブルシューティング ドキュメントもご覧ください。

しかし、可能であれば、同じことをローカルで行う (つまり、リークを修正する) 方が良いと思います。

于 2011-03-18T07:31:58.460 に答える
1

したがって、現在のメモリ使用量を教えてくれるデバッグ ステートメントを書く必要があると思います。

あなたは私のように、JVisualVM や JConsole などの外部プロファイリング ツールを使用する代わりに、コードでプロファイリングすることを好むと思います。

CoralBitsのMemorySampler (私が作成)というツールを使用すると、コードのどの行でメモリが割り当てられているかを正確に知ることができます。以下に例を示します。

ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();
MemorySampler.start();
for(int i = 0; i < strings.length; i++) queue.offer(strings[i]);
for(int i = 0; i < strings.length; i++) queue.poll();
MemorySampler.end();
if (MemorySampler.wasMemoryAllocated()) MemorySampler.printSituation();

次の出力が得られます。

Memory allocated on last pass: 24576
Memory allocated total: 24576

Stack Trace:
    java.util.concurrent.ConcurrentLinkedQueue.offer(ConcurrentLinkedQueue.java:327)
    TestGC.main(TestGC2.java:25)

ソース コードの 327 行目に移動すると、そこにインスタンスがConcurrentLinkedQueue割り当てられていることがわかります。Node

免責事項:私は CoralBits の開発者の 1 人です。

于 2014-06-18T07:19:35.973 に答える