ヒープダンプまたは実行中のVMがある場合、永続世代のコンテンツが何であるかを確認するにはどうすればよいですか?'jmap -permstat'については知っていますが、Windowsでは使用できません。
8 に答える
この記事Java SE 5 によるメモリ監視では、ヒープの使用状況、メモリ プール (permgen スペースを含む) などに関する情報をプログラムで検出する方法について説明しています。その非常に簡単です:
MemoryUsage usage = ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage();
long nonHeapFree = usage.getMax() - usage.getUsed();
long nonHeapTotal = usage.getMax();
OSX (Sun VM) での私のテストでは、「非ヒープ メモリ使用量」は permgen プールに対して返された値とほぼ一致し、おそらく permgen を持たない VM で何か役に立つでしょう。
パーマネント ジェネレーションにはクラス オブジェクトが含まれます。そのため、クラスのヒープ ダンプまたは他の形式のオブジェクト リストを確認する必要があります。パーマネント ジェネレーションのサイズに問題がある場合、通常は次の 2 つの理由が原因です。
- 使用するプログラムまたはライブラリがクラスを動的に作成し、永続的な生成のデフォルト サイズが小さすぎる - 単純に -XX:MaxPermSize=256m でサイズを作成する
- 使用するプログラムまたはライブラリは、呼び出されるたびに新しいクラスを動的に作成するため、永続的な世代のサイズがノンストップで増加します。これはプログラミング エラーであり、修正する必要があります (または、修正を検索するか、バグ レポートを作成します)。
どちらがあなたのケースであるかを確認するには、より長い期間にわたる永久世代のサイズを確認してください。
そして、永続的な世代についての良い概要:
http://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation
解決すべき特定の問題がありますか?String.intern()の使用は、permgen問題の典型的な原因の1つです。さらに、クラスが多いプロジェクトにもpermgenの問題があります。
permgenに入り、そこに何があるかを確認する方法がわかりません...
Eclipse の permsizeに関する私のブログ投稿を参照してください。
つまり、Memory Analyzer で実行できますが、SAP JVM が必要です。
永続的な生成には、クラス定義とインターンされた文字列の 2 種類しか含まれていません。後者で問題が発生することはめったにありませんが、問題のせいにされることがよくあります。多くの場合、コード生成と部分的なホット リロード (ダングリング リファレンス) が原因で、前者が問題を引き起こします。
名前が示すように、permgen も最終的には GC されますが、通常の GC サイクルの一部ではありません。したがって、参照されていないインターンされた文字列と未使用のクラスはクリーンアップされます。ただし、permgen も動的に拡張されないため、JVM 起動用に設定のサイズを手動で変更する必要がある場合があります。
私を助けたテクニックの 1 つは、-verbose:class
コマンドライン オプションを javaに使用することでした。これにより、クラスがロード/アンロードされたことを示すログ出力が得られます。クラスは permgen にロードされるため、これは特定の状況で役立ちます。
私は同じことを調べていますが、組み込みプラットフォームのメモリの制約が原因です。
jmap のコードを見てください。permstat ツールは、sun.jvm.hotspot.tools.HeapSummary クラスが使用可能な場合にのみ使用できます。このクラスは、サービスアビリティ エージェントの一部です。OpenJDK のドキュメント (http://openjdk.java.net/groups/serviceability/svcjdk.html#bsa) によると:
Serviceability Agent コンポーネントは、HotSpot リポジトリの標準ビルドの一部としてビルドされます。これらのコンポーネントは次のとおりです。
-libsaproc.so: これは、SA のネイティブ コード コンポーネントです。
-sa-jdi.jar: SA の Java クラスが含まれています。これには、JDI クライアントがコア ファイルとハングしたプロセスで読み取り専用デバッグを実行できるようにする JDI の実装が含まれています。
SA は jinfo、jmap、jstack で使用されます
注: 現在、Serviceability Agent とそれを使用するテクノロジは、Windows プラットフォームの JDK リリースには含まれていません。
Oracle JDKにも当てはまるようです。詳細情報を取得するために jmap ツールを変更しようとしています。
JConsole または jvisualvm.exe (jdk 1.6 7 を使用) を使用して、何がどこにあるかを見つけることができます。すべてのオブジェクトが互いにどのように関連しているか、およびオブジェクトのツリーがどのように関連しているかを知りたい場合は、Eclipse Memory Analyzer -- http://www.eclipse.org/mat/を試してください。
要約すると、「 http://www.eclipse.org/mat/ 」から欲しいものが得られます。
幸運を、