Eclipseでテストできないサーブレットを作成しています。サーバーで実行する必要があります。メモリプロファイリングを行い、リークを特定したいと思います。したがって、現在のメモリ使用量を教えてくれるデバッグステートメントを作成する必要があると思います。誰かがこれを行う方法やJDKのどのクラスがこれを行うかについての良い参考資料を教えてもらえますか?
「EclipseMAT」は使用できませんのでご注意ください。
Eclipseでテストできないサーブレットを作成しています。サーバーで実行する必要があります。メモリプロファイリングを行い、リークを特定したいと思います。したがって、現在のメモリ使用量を教えてくれるデバッグステートメントを作成する必要があると思います。誰かがこれを行う方法やJDKのどのクラスがこれを行うかについての良い参考資料を教えてもらえますか?
「EclipseMAT」は使用できませんのでご注意ください。
jdk jvisualvmの組み込みツールを使用できませんか?
JConsoleがあなたを救います!
したがって、現在のメモリ使用量を教えてくれるデバッグ ステートメントを書く必要があると思います。
ガベージ コレクターを使用すると、カウントを確認するだけでメモリ リークを見つけるのがやや難しくなるため、あまり役に立たない可能性があります (gc がいつ実行され、実際に何を収集するのかはよくわかりません。収集されない場合もあります)。収集可能なものすべて)。そのため、いくつかのメモリ スナップショットを作成して分析する必要がある場合があります。つまり、どのオブジェクト (またはどのタイプのオブジェクト) が収集されていないかを確認し、その結果、より多くのインスタンスが作成されます。
これについては、推奨ツール (JVisualVM、JConsole) を参照してください。
プログラム内からメモリ使用量の情報を取得したい場合は、java.lang.managementパッケージのクラスを試してください。
したがって、現在のメモリ使用量を教えてくれるデバッグ ステートメントを書く必要があると思います。
あなたは私のように、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 人です。