OutOfMemoryErrorの系列(4):メタスペース
これは、このシリーズの第四の記事、関連する記事の一覧です。
- OutOfMemoryErrorの系列(1):Javaのヒープスペース
- OutOfMemoryErrorの系列(2):GCオーバーヘッド制限を超え
- OutOfMemoryErrorの系列(3):Permgenスペース
- OutOfMemoryErrorの系列(4):メタスペース
JVM Javaプログラムは、/修正この制限を変更することができます起動パラメータを指定し、最大メモリを制限します。下に示すように、Javaヒープメモリは、複数の部分に分割されています。
【上記Java8]とすることにより、これらのメモリ・プールの最大値 -Xmx
と -XX:MaxMetaspaceSize
指定JVM起動パラメータ。明示的に指定されていない場合、(OSバージョン版+ JVM)と物理メモリのサイズは、プラットフォームの種類に応じて決定されます。
java.lang.OutOfMemoryErrorを:メタスペースの メタデータ領域(メタスペースが)で充填されている:情報エラーが表されます。
原因分析
あなたはJavaの古いドライバがPermGenのJava 8の開始に精通している必要がありますが、メモリ構造が受け大幅な変更がある場合は、もはやPermgenを使用していないが、新しい空間の導入:様々な考慮事項に基づいて..メタスペースこの変更、いくつかのその理由は以下の通り:
-
特定Permgenどのくらいのスペースを予測することは困難です。小さな原因指定 java.lang.OutOfMemoryErrorを:Permgenサイズの 誤差を、そしてより多くの無駄を設定します。
-
以下のために GCの性能が 向上するので、コンカレントガベージコレクションプロセスステージはもはやされていることを ストール、特定の(特異的なイテレータ)のメタデータのさらなるトラバーサル。
-
以下のための G1のガベージコレクタ の並行クラスアンロードの綿密な最適化。
Java8では、PermGen内のすべてのコンテンツの前に、我々はメタスペーススペースを移動しました。例:クラス名、フィールド、メソッド、バイトコード、定数プール、JIT最適化されたコード、などが挙げられます。
メタスペースの利用数はJVMクラスのメモリ/サイズにロードされます。言うことができる のjava.lang.OutOfMemoryError:メタスペースは 、エラーの主な理由は、あまりにも多くのクラスまたはあまりにもかさばるのメモリにロードされます。
例
そして PermGen最後の章では、 JVMがロードされたクラスの数との素晴らしい関係を持って、メタスペーススペースの使用に似ています。以下は簡単な例です:
public class Metaspace {
static javassist.ClassPool cp = javassist.ClassPool.getDefault();
public static void main(String[] args) throws Exception{ for (int i = 0; ; i++) { Class c = cp.makeClass("eu.plumbr.demo.Generated" + i).toClass(); } } }
これは、使用して見ることができます Javassistの ツールは非常にシンプルであるクラスライブラリを生成します。forループでは、動的に生成されたクラスの多くは、クラスは、最終的にはメタスペースにロードされます。
このコードの実装は、より多く生成されたクラスとして、最終的には、メタスペースのスペースを占有スローされます java.lang.OutOfMemoryErrorをする:メタスペース。上のMac OS XのJava 1.8.0_05環境の下で、あなたがスタートを設定した場合パラメータ -XX:MaxMetaspaceSize = 64M 70,000クラスJVMがハングします後、ロードされました。
ソリューション
あなたはメタスペースでのOutOfMemoryErrorを投げるに関連した場合、最初のソリューションは、次のような起動パラメータを使用してメタスペースのサイズを大きくすることです。
-XX:MaxMetaspaceSize=512m
ここではメタスペースの最大は512メガバイトに設定されて使用されていない場合、それはスローされません OutOfMemoryErrorが。
一見単純な解決策は、直接メタスペースのサイズ制限を削除することですがあります。ただし、システムのパフォーマンスに深刻なドラッグをメモリスワップ(スワップ)が発生することがあり、物理メモリ場合は、メタスペースのメモリサイズを制限しません。また、それはまた、ネイティブのメモリ割り当ての失敗やその他の問題を引き起こす可能性があります。
現代のアプリケーションクラスタでは、むしろ彼らの遅い応答をしたくない、アプリケーションノードがハングアップしましょうでしょう。
あなたが警告を受信しない場合、あなたは、ダチョウのように振る舞うことができ java.lang.OutOfMemoryErrorをする:メタスペースの エラーメッセージが隠されて。しかし、これは本当に問題、流行を延期する時間の問題を解決しません。実際にメモリリークがある場合は、真剣に解決策を探して、以前の記事を参照してください。
オリジナルリンク: https://plumbr.eu/outofmemoryerror/permgen-space
翻訳発売日:2017年9月19日