1. メモリモデルとランタイムデータ領域この章では、Java 仮想マシンのメモリ モデルについて紹介します。JVM ランタイム データベースは仕様であり、JVM メモリ モデルはこの仕様の実装であると理解できます。 Java 仮想マシンはヒープ領域とメソッド領域にデータを格納することに重点を置いているため、この章ではこれら 2 つの側面についても詳しく説明します。ヒープとメソッド領域は共有メモリですが、Java 仮想マシン スタック、ネイティブ メソッド スタック、およびプログラム カウンターはスレッド専用です。 2. マインドマップと凡例1 つは非ヒープ領域 (メソッド領域) であり、一般に「永続世代」とも呼ばれます。もう 1 つはヒープ領域で、若い領域と古い領域に分かれています。若い領域は 2 つの部分に分かれており、1 つは Eden 領域、もう 1 つは Survivor 領域 (S0+S1) です。S0 領域は From 領域とも呼ばれ、S1 は To 領域とも呼ばれます。 3. オブジェクトはJVMからスペースを申請する4. サバイバーゾーンはなぜ必要なのでしょうか?なぜ生存者エリアが必要なのでしょうか? エデンで十分ではないのですか? Survivor 領域を設計しないと仮定すると、Eden 領域で MinorGC が実行され、オブジェクトは直接 Old 領域に送られます。このようにすると、Old 領域はすぐにいっぱいになります。Old 領域がいっぱいになると、FullGC が実行されます (Old 領域では MajorGC が実行され、通常は MinorGC が伴います)。FullGC は非常に時間がかかるため、Survivor 領域を設計する目的は、Old 領域に送られるオブジェクトの数を減らすことです。過渡的な Survivor 領域があります。
5. なぜ 2 つのサバイバー ゾーンが必要なのですか?
6. 検証例ヒープメモリオーバーフローlombok.Data をインポートします。 org.springframework.web.bind.annotation.GetMapping をインポートします。 org.springframework.web.bind.annotation.RestController をインポートします。 java.util.ArrayList をインポートします。 java.util.List をインポートします。 @レストコントローラ パブリッククラスHeapController{ リスト<Foo> リスト = 新しい ArrayList<Foo>(); @GetMapping(値 = {"ヒープ"}) パブリック文字列ヒープテスト() { (真)の間{ リストに追加します(新しいFoo()); } } @データ クラスFoo { 文字列 str; } } インターフェースにアクセスすると、メモリ オーバーフローが発生します。
メソッド領域のメモリオーバーフローasm、maven 構成の使用: <依存関係> <groupId>アセンブラ</groupId> <artifactId>アセンブリ</artifactId> <バージョン>3.3.1</バージョン> </依存関係> コードを記述し、メソッド領域にクラス情報を追加します。コンピュータのパフォーマンスが十分でない場合は、このコードを実行しないでください。コンピュータが再起動する原因になりやすいです。メモリを消費しすぎる場合は、ループの数を減らすこともできます。 org.objectweb.asm.ClassWriter をインポートします。 org.objectweb.asm.MethodVisitor をインポートします。 org.objectweb.asm.Opcodes をインポートします。 java.util.ArrayList をインポートします。 java.util.List をインポートします。 パブリッククラスMyMetaspaceはClassLoaderを拡張します{ パブリック静的リスト<Class<?>>createClasses() { List<Class<?>> classes = new ArrayList<Class<?>>(); (int i = 0; i < 10000000; ++i) の場合 { クラスライター cw = 新しいクラスライター(0); cw.visit(Opcodes.V1_1, Opcodes.ACC_PUBLIC, "クラス" + i, null, "java/lang/Object", null); MethodVisitor mw = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null); mw.visitVarInsn(Opcodes.ALOAD, 0); mw.visitMethodInsn(Opcodes.INVOKESPECIAL、"java/lang/Object"、 "<init>", "()V"); mw.visitInsn(オペコード.RETURN); mw.visitMaxs(1, 1); mw.visitEnd(); MyMetaspace テスト = 新しい MyMetaspace(); バイト[]コード = cw.toByteArray(); クラス<?> exampleClass = test.defineClass("Class" + i, code, 0, コードの長さ); クラスを追加します(exampleClass); } クラスを返します。 } } メソッド領域テストインターフェース: com.example.jvm.jvmexceptionexample.asm.MyMetaspace をインポートします。 org.springframework.web.bind.annotation.GetMapping をインポートします。 org.springframework.web.bind.annotation.RestController をインポートします。 java.util.ArrayList をインポートします。 java.util.List をインポートします。 @レストコントローラ パブリッククラスNonHeapController { リスト<Class<?>> list = 新しい ArrayList<Class<?>>(); @GetMapping(値 = {"/noheap"}) パブリック文字列noheap() { (真)の間{ リストにすべてを追加します(MyMetaspace.createClasses()); } } }
Java 仮想マシン スタック前に学んだように、Java 仮想マシン スタックはスタック フレームの形式で保存されます。1 つのメソッドは 1 つのスタック フレームに対応し、キュー モードでスタックにプッシュされます。したがって、プログラムが Java 仮想マシン スタックに問題を引き起こすかどうかをテストする場合は、再帰メソッドを使用してテストできます。 org.springframework.web.bind.annotation.GetMapping をインポートします。 org.springframework.web.bind.annotation.RestController をインポートします。 @レストコントローラ パブリッククラスStackController{ パブリック静的ロングカウント = 0; パブリック静的void add(long i) { カウント++; 追加(i); } @GetMapping(値 = {"スタック"}) パブリックボイドスタック(){ 追加(1); } } StackOverflow、スタックオーバーフロー例外:
以上がJVMシリーズのメモリモデルの詳細説明の内容です。JVMメモリモデルのメモリ構造の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: Ubuntu 18.04 に mysql5.7.23 をインストールするチュートリアル
>>: Windows 上で Zookeeper サーバーを構築するチュートリアル
目次1. はじめに2. 本文2.1 単一列のソート2.2 複数の列を並べ替える2.3 ソート方法2....
目次背景解決策1アイデア:コード:解決策2アイデア:要約する参照する背景日付と時間をフォーマットする...
MySQL8.0.22のインストールと設定(超詳細)参考までに、具体的な内容は次のとおりです。みなさ...
【歴史的背景】私は 3 年間 MySQL-DBA として働いてきましたが、MySQL が「基本的に利...
リストスタイルのプロパティHTMLには、順序なしリストと順序ありリストの2種類のリストがあります。仕...
1. はじめにデータベース内のデータ量が一定レベルに達すると、システムパフォーマンスのボトルネックを...
方法 1: INSERT INTO t1(field1,field2) VALUE(v001,v00...
ポップアップは、現在のウィンドウにメニューツールバーがあるかどうかとは関係ありません。ページにスクリ...
目次序文列挙可能なプロパティ反復可能なオブジェクトforEachメソッドとmapメソッドチェーン呼び...
MySQL Community Server 5.7.18 の配布パッケージには .ini ファイル...
目次1. トリガーソリューション2. パーティションテーブルソリューション3. 一般的な表領域ソリュ...
Web ページには、非常に複雑な HTML 構造があります。CSS を使用して関連するスタイルを定義...
アーティストになるつもりがない場合は、開発者として HTML を読んで、必要に応じて簡単な変更を加え...
win docker-desktopを使ってコンテナ開発に接続し、ネットワーク上で色々試してみたいと...
この記事では、Vueの簡単なコメント機能を実装するための具体的なコードを参考までに共有します。具体的...