Java の共通メモリ オーバーフロー例外とコードの実装
Java Heap OutOfMemoryError
Java ヒープはオブジェクト インスタンスの保存に使用されるため、継続的にオブジェクトを作成し、オブジェクトがガベージ コレクションされないように GC ルートと作成されたオブジェクトの間に到達可能なパスがあることを確認すると、作成されたオブジェクトが通過すると、時間が経つとヒープのメモリが不足し、OutOfMemoryError 例外が発生します。上記は OutOfMemoryError 例外を引き起こすコードです。オブジェクトを継続的に作成してリストに保存するため、オブジェクトが多すぎるとヒープ メモリがオーバーフローします。
java -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError を通じてヒープ メモリを 10 MB に設定し、パラメータ -XX:+HeapDumpOnOutOfMemoryError を使用して、OutOfMemoryError 例外が発生したときに JVM が現在のメモリ スナップショットを出力できるようにし、後続の分析に使用します。
上記のコードをコンパイルして実行すると、次の出力が得られます:
/** * @author xiongyongshun * VM Args: java -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError */ public class OutOfMemoryErrorTest { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); int i = 0; while (true) { list.add(i++); } } }
Java stack StackOverflowError
のランタイム データ領域に仮想マシン スタックと呼ばれるメモリ領域があることがわかります。 JVM この領域の役割は次のとおりです: 各メソッド 実行中にローカル変数テーブル、オペランド スタック、メソッド出口などの情報を保存するためのスタック フレームが作成されます。大きすぎると、スタックが枯渇し、StackOverflowError 例外が発生します。
具体的なコードは次のとおりです。
>>> java -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError com.test.OutOfMemoryErrorTest 16-10-02 23:35 java.lang.OutOfMemoryError: Java heap space Dumping heap to java_pid1810.hprof ... Heap dump file created [14212861 bytes in 0.125 secs] Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3210) at java.util.Arrays.copyOf(Arrays.java:3181) at java.util.ArrayList.grow(ArrayList.java:261) at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235) at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227) at java.util.ArrayList.add(ArrayList.java:458) at com.test.OutOfMemoryErrorTest.main(OutOfMemoryErrorTest.java:15)
上記のコードをコンパイルして実行すると、次の例外メッセージが出力されます。 :
/** * @author xiongyongshun * VM Args: java -Xss64k */ public class OutOfMemoryErrorTest { public static void main(String[] args) { stackOutOfMemoryError(1); } public static void stackOutOfMemoryError(int depth) { depth++; stackOutOfMemoryError(depth); } }
メソッド領域のメモリオーバーフロー
Exception in thread "main" java.lang.StackOverflowError at com.test.OutOfMemoryErrorTest.stackOutOfMemoryError(OutOfMemoryErrorTest.java:27)
, 因为 JDK8 已经移除了永久代, 取而代之的是 metaspace, 因此在 JDK8 中, 下面两个例子都不会导致 java.lang.OutOfMemoryError: PermGen space 异常.
, 上面所说的 String.intern() 方法和常量池的内存分布仅仅针对于 JDK 1.6 及之前的版本, 在 JDK 1.7 或以上的版本中, 由于去除了永久代的概念, 因此内存布局稍有不同.
/** * @author xiongyongshun * VM Args: -XX:PermSize=10M -XX:MaxPermSize=10M */ public class RuntimeConstantPoolOOMTest { public static void main(String[] args) { List<String> list = new ArrayList<String>(); int i = 0; while (true) { list.add(String.valueOf(i++).intern()); } } }
Exception in thread "main" java.lang.OutOfMemoryError: PermGen space at java.lang.String.intern(Native Method) at com.test.RuntimeConstantPoolOOMTest.main(RuntimeConstantPoolOOMTest.java:16)
, 如果通过 JDK1.8 来编译运行上面代码的话, 会有如下警告, 并且不会产生任何的异常:
メソッド領域のメモリオーバーフロー
メソッド領域の機能は、クラス名などのクラス関連情報情報を保存することです。クラスのアクセス修飾子、フィールドの説明、メソッドの説明など。そのため、メソッド領域が小さすぎて、ロードされるクラスが多すぎると、メソッド領域のメモリがオーバーフローします。
>>> java -XX:PermSize=10M -XX:MaxPermSize=10M com.test.RuntimeConstantPoolOOMTest 16-10-03 0:23 Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=10M; support was removed in 8.0 Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=10M; support was removed in 8.0
上記のコードでは、CGlibを使用しています。多数のクラスを動的に生成するには、JDK6 で上記のコードを実行すると、OutOfMemoryError: PermGen スペース例外が生成されます:
/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/bin/java -jar - XX:PermSize=10M -XX:MaxPermSize=10M target/Test-1.0-SNAPSHOT.jar
出力結果は次のとおりです://VM Args: -XX:PermSize=10M -XX:MaxPermSize=10M public class MethodAreaOOMTest { public static void main(String[] args) { while (true) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(MethodAreaOOMTest.class); enhancer.setUseCache(false); enhancer.setCallback(new MethodInterceptor() { public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { return methodProxy.invokeSuper(o, objects); } }); enhancer.create(); } } }
「メソッド領域のメモリオーバーフロー」セクションで、次のように述べました。 JDK8 には永続的な生成の概念がないため、これら 2 つの例は JDK8 では期待どおりの結果を達成できませんでした。JDK8 では、メソッド領域のメモリ オーバーフローなどのエラーはありますか? もちろん、JDK8 では MetaSpace 領域が使用されます。クラス関連の情報を格納するため、MetaSpace のメモリ領域が不十分な場合、 java.lang.OutOfMemoryError: Metaspace 例外がスローされます
例として上記の例を見てみましょう:
Caused by: java.lang.OutOfMemoryError: PermGen space at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:637) at java.lang.ClassLoader.defineClass(ClassLoader.java:621) ... 11 more
例は変更されていません。唯一の違いは、このコードを実行するために JDK8 を使用し、パラメーター -XX:MaxMetaspaceSize=10M を設定する必要があることです。このパラメーターは、メタスペースの最大サイズが 10M であることを JVM に伝えます。 JDK8 を使用してこの例をコンパイルして実行すると、次の例外が出力されます:
//VM Args: -XX:MaxMetaspaceSize=10M public class MethodAreaOOMTest { public static void main(String[] args) { while (true) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(MethodAreaOOMTest.class); enhancer.setUseCache(false); enhancer.setCallback(new MethodInterceptor() { public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { return methodProxy.invokeSuper(o, objects); } }); enhancer.create(); } } }
上記は、一般的な Java メモリ オーバーフロー例外とコード実装の内容です。詳細については、PHP 中国語 Web サイト (www. php.cn)!

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Java のアームストロング番号に関するガイド。ここでは、Java でのアームストロング数の概要とコードの一部について説明します。

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです
