JavaのPermGenスペースの重要性は何ですか?
4 に答える
PermGen スペースは、長期的なオブジェクト (主にClass
によってロードされるオブジェクト) 用に予約されていClassLoader
ます。PermGen は、非常に特殊な状況 (具体的には、ClassLoader
これらのクラスをロードした がスコープ外になる場合) を除き、ガベージ コレクションされません。
これはガベージ コレクションの最適化です。ガベージ コレクションの対象とならないオブジェクトが個別に格納される場合、残りのオブジェクトが格納される領域が圧縮され、ガベージ コレクタの作業が少なくなります。
PermGen は、世代別ガベージ コレクションを持つ VM に固有です。
たとえば、JRockit を使用する場合、JRockit にはその概念がないため、「PermGen の重要性」は存在しません。
数年前、奇妙な「PermGen スペース外」エラーが表示され始め、コンポーネントの 1 つを交換するのが誰のせいか (Tomcat + Hibernate + Sun VM がこれをトリガーするために使用) をまだ誰も知らなかったとき、それは一般的でした。 (今日では問題は理解されていますが、何年も前に作物が作られ始めたとき、これに関する情報を見つけることはほとんど不可能でした). Tomcat を Resin に、Sun VM を JRockIt などに置き換えることができます。
PermGen は Java 仕様の一部ではなく、(かなり) 一部の VM の実装の詳細にすぎないことを指摘することは重要だと思います。
本当に知っておく必要がある唯一のことは、PermGen スペースが一般的なヒープから分離されており、-Xmx
VM パラメーターの影響を受けないことです。多くのクラス定義をロードするアプリケーション (アプリケーション サーバーや IDE など) がある場合は、-XX:MaxPermSize
VM オプションを使用して PermGen スペース サイズを設定できます。
パーマネント世代は、ユーザー クラス (Java 言語の一部ではないクラス) を記述するメタデータを保持します。
大規模なコード ベースを持つアプリケーションは、ヒープのこのセグメントをいっぱいにすることがあり、java.lang.OutOfMemoryError: PermGen
. これは、-Xmx 設定やマシンのメモリ量には影響されません。新しい初期サイズを設定するには、 を使用します-XX:PermSize=64m
。最大サイズを設定するには、-XX:MaxPermSize=128m