Javaアプリケーションを監視するためにJconsoleを使用しています。[メモリ]タブには、次のような異なるヒープメモリと非ヒープメモリが表示されます。
これらの用語の違いは何ですか。また、これらのパラメータを監視してアプリケーションの動作の異常を見つける方法に関する情報も提供してください。
すべてのCベースの言語(および他のほとんどの言語)には、基本的に3つのストレージカテゴリがあります。
使い慣れたヒープ。
あなたもよく知っているスタックですが、あなたはそれを知らないだけです。 「ローカル」変数を持つメソッドがある場合、それらの変数は「呼び出しフレーム」に割り当てられます。 「呼び出しフレーム」は、メソッドを呼び出すときに割り当てられ、メソッドから戻るときに削除されるため、呼び出しに伴って大きくなり、戻りとともに縮小する「スタック」を使用して最も効率的に実装されます。
静的は明示的に割り当てないものであり、プログラムの実行が開始された時点から本質的に存在します。
スタックに必要なスペースは一般的にかなり小さく、上記のカテゴリの「非ヒープメモリ」にまとめられます。
非ヒープメモリは、JVMがヒープ以外の目的で割り当てたすべてのメモリです。これも:
リストの「CMS Old Gen」、「Par Eden Space」、「Par Survivor Space」、および「CMS Perm Gen」はすべて、ヒープのさまざまなセクションを指します。
リンク http://www.yourkit.com/docs/kb/sizes.jsp および http://publib.boulder.ibm.com/infocenter/javasdk/v5r0に従ってください。 /index.jsp?topic=%2Fcom.ibm.Java.doc.diagnostics.50%2Fdiag%2Fproblem_determination%2Faix_mem_heaps.html
非ヒープまた、JVMには非ヒープメモリと呼ばれる、ヒープ以外のメモリがあります。これは、JVMの起動時に作成され、ランタイム定数プール、フィールドとメソッドのデータ、メソッドとコンストラクターのコード、インターンされた文字列などのクラスごとの構造を格納します。
残念ながら、JVMがヒープ以外のメモリに関して提供する唯一の情報は、その全体のサイズです。非ヒープメモリの内容に関する詳細情報はありません。
非ヒープメモリサイズの異常な増加は、潜在的な問題を示している可能性があります。この場合、次のことを確認できます。
ローダーのリークなど、クラスの読み込みに関する問題がある場合。この場合、クラスローダービューを使用して問題を解決できます。大量に収容されている文字列がある場合。このような問題を検出するために、オブジェクト割り当て記録を使用できます。