友達、
HeapとPermGenの重要性、違い、使用法を教えてください。また、それぞれにどのクラスがロードされているかを知っておくとよいでしょう。
Java VM仕様に関連する説明は本当に役に立ちます
ありがとうプニート
メモリ(ヒープ)は世代ごとに管理されるか、さまざまな年齢のオブジェクトを保持するメモリプールです。ガベージコレクションは、世代がいっぱいになると各世代で発生します。オブジェクトは、若いオブジェクトまたはyoung generation
の世代に割り当てられ、乳児死亡率のため、ほとんどのオブジェクトはそこで死亡します。
新しいオブジェクトが作成されると、それはYoung Generation
の一部であるEdenスペースに移動します。
オブジェクトがしばらく経ってもまだ生きている場合は、tenured generation
に移動します。ここには長寿命のオブジェクトがあります。
オーバープロセスが存在するまでオブジェクトが存続することになっている場合、オブジェクトはPerm Generation
.Java classes
に移動され、永続世代に格納されます。
良いリンクがあります PermGenは実際には何を表していますか? 。特にこれが好き ブログ
PermGenやその他のヒープメモリ部分についても同じ疑問がありました。いくつかの検索を行った後、ここで私が最終的に結論したこと。
Java HotSpot VMは、オペレーティングシステムから取得するメモリを必要とします。このメモリは、ヒープメモリと呼ばれます。現在、オブジェクトを格納し、他の重要なものも保持することで有名なヒープメモリです。
短いライブスパンJavaオブジェクトは若い世代に格納され、それらのオブジェクトがさらに実行する必要がある場合は、保有期間/古い世代にシフトされます。また、ジェネレーションガベージのタイプによって異なります。コレクター、メモリがクリーンアップされます。
パーマネントジェネレーション(PermGen)はどうですか? Java HotSpot VMは、ロードされたクラスやその他のメタデータを格納するためにJVMによって使用されるPermGenにクラス/クラス構造をロードします。PermGenはオブジェクトを保存します。
オブジェクトとクラス構造とは別に、JVMコード自体がプロファイラーエージェントコードとデータなどをロードします。
つまり、基本的に、ヒープ=オブジェクト+クラス構造+ JVMアーキテクチャです。
参照: Java Docs 、 Java GCガイド
Permgenはヒープメモリ内のメモリ領域のみであると思います。文字列を保持するなどの特別な目的のために作成されます。
作成されたすべてのオブジェクトがPermgenメモリを取得するわけではありません。これは、JDK6以下のStringなどの特別なクラス専用です。
8以降のような最新のJDKバージョンでは、Pergenは見つかりませんが、NonHeapやその他のさまざまなキャッシュメモリなどの新しいメモリが導入されています。
私は専門家ではありませんが、PermGemメモリはヒープ内にあります。これは、実行時にすべてのクラスがロードされる特別な場所のようなものだからです。したがって、クラスが多すぎると、PermGemはOutOfMemoryExceptionをスローします。そして、ヒープは、インスタンス化したオブジェクトをJavaコード内に格納します。ここで、GCは、スタック内の実行中のスレッド内の変数によって参照されていないオブジェクトを収集します。