この質問に関して複数のコメントを見てきました。「はい」と言う人もいれば「いいえ」と言う人もいますが、答えの多くはあいまいです。誰かがそれが存在する場所をより簡単な言葉で説明できますか?ある投稿では、クラスローダーによってクラスがロードされるクラスメモリと同じメモリの場所を共有していると誰かが言っているのを見たことがあります-それは本当ですか?
5 に答える
元の(おそらく間違った)答え:ウィキペディアを信じるなら、それはヒープの一部です。
編集:OPによるコメントで参照されているサイトを含め、これについて詳しく調べました。この調査中に、このドキュメントを参照するこのSOの質問に出くわしました。これは、Sun Java(バージョン6)の場合、永続的なコレクションが実際にはヒープの外にあることを示しています。とは言うものの、私はJavaの専門家ではなく、以前はこのレベルでのメモリ管理の詳細を認識していませんでした。私の読みが正しければ、永続世代の配置(または存在さえ)はjvm実装の詳細です。
ブラックボックスの観点から、Sun JVMでは、永続的な生成は、のドキュメントに記載されているようにヒープの一部ではありません。jconsole
永続的な生成(非ヒープ):クラスオブジェクトやメソッドオブジェクトなど、仮想マシン自体のすべてのリフレクティブデータを含むプール。クラスデータ共有を使用するJavaVMでは、この世代は読み取り専用領域と読み取り/書き込み領域に分けられます。
実際には、これは、永続的な生成がヒープに含まれていないため、JVMプロセスでメモリが-XX:MaxPermSize
合計されることを意味します。-Xmx
これがトピックの私の理解です:
永続世代は、クラス定義が格納されるヒープの領域です。http://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generationに示されているように、すべてのクラスインスタンスには、永続世代のタイプのクラスのインスタンスへの「klass」参照があります。実行時に新しいタイプが作成されると、そのタイプの永続的な生成に新しいスペースが割り当てられます。
Jon Masamitsuのブログ投稿の図は、永続世代と、プログラムのオブジェクトインスタンスを格納できるヒープのより頻繁に収集される部分との間の論理的な分離を示しています。永続的な世代はまだヒープの一部です。
Javaガベージコレクションの基本を読んだときに同じ質問がありました。この記事では、著者は永続的な生成はヒープの一部であると考えています。
しかし、私たちは両方を持っています:
- -Xmx
- -XX:MaxPermSize
そしてグーグルの質問の後、私はこの質問を見つけますJavaヒープの用語:若い、古い、そして永続的な世代?、結論としての回答:
永続世代はヒープの一部ではありません
PermgenはJava8から削除されました。これで、ヒープの一部でも内部メモリの一部でもないメタスペースができました。
また、コマンド-Xmx -XX:MaxPermSizeはJava8から無視されます