39

Linuxで実行されているJavaプロセスのメモリがどこにあるかを見つけようとしています。誰かが私がpmap-xを使用して、メモリが何をしているかを正確に確認することを提案しました。

出力は本当に長いですが、基本的にそれのかなりの部分はこれの繰り返しです:

00007fbf75f6a000    1016       -       -       - rwx--    [ anon ]
00007fbf76068000      12       -       -       - -----    [ anon ]

これは正確にはどういう意味ですか?なぜこれほど多くのエントリ(4000以上)があるのですか?

4

4 に答える 4

40

アノンブロックは、mallocまたはmmapを介して割り当てられた「大きな」ブロックです。マンページを参照してください。そのため、Javaヒープとは何の関係もありません(ヒープ全体をそのようなブロックに格納する必要があるという事実を除いて)。

私の経験では、スレッドスタックもanonブロックを使用します。すべて同じサイズのanonブロックが多数あり、そのサイズが512kから4Mbである場合(以下の例は、実行中のTomcatプロセスに対して12回以上繰り返されます)、それが原因である可能性があります。プログラムによっては、これらが最大で数十個ある場合があります。何千も表示されている場合は、スレッド化に問題があることを意味します。

b089f000    504K rwx--    [ anon ]
b091d000     12K -----    [ anon ]
b0920000    504K rwx--    [ anon ]
b099e000     12K -----    [ anon ]
b09a1000    504K rwx--    [ anon ]
b0a1f000     12K -----    [ anon ]

しかし、それは疑問を残します:なぜJavaメモリの問題を診断するためにpmapを使用しているのですか?

于 2009-09-27T12:15:13.873 に答える
4

見るこの部分 匿名メモリのシステム パフォーマンス チューニングのこの部分。

于 2009-09-25T15:34:35.750 に答える
3

スレッドリークでそのパターンを見たことがあります。スレッドをプールしようとしているコードがあるが、どういうわけか混乱してスレッドをリークしている場合、pmap でそのようなパターンが得られます。

メモリの各ビットは、スレッドの最小スタック サイズだと思います。確かに、私たちの場合、ヒープとは何の関係もありませんでした。
OS の制限に達した場合でも、割り当て超過でないヒープを分析した場合でも OutOfMemoryErrors が発生しました。

このような問題が発生したときpmap [pid] | grep -c 12K、使用中のスレッドの数が判明しました。

于 2011-07-30T00:15:09.910 に答える
2

Eclipse MAT を使用します (ネイティブ ヒープではなく Java ヒープで OutOfMemoryExceptions を取得した場合)。

于 2009-10-07T02:20:12.237 に答える