JVM エスケープ分析を 3 分で理解する
資格のある Java 開発者ならご存知のように、基本的にすべてのオブジェクトはヒープ上に作成されます。ただし、ここにはまだ絶対的な単語はなく、 基本的にすべての を指します。
昨日のインタビュー中に、友人はすべてのオブジェクトはヒープ内に作成されると言い、インタビュアーを笑いました。
それでは本文を始めましょう。今日はエスケープ分析について話しましょう。
エスケープ分析 (エスケープ分析) は、現在、Java 仮想マシンにおける比較的最先端の最適化テクノロジです。これは、Java プログラムにおける同期負荷とメモリ ヒープ割り当ての圧力を効果的に軽減できる、機能横断的なグローバル データ フロー分析アルゴリズムです。 Java ホットスポット コンパイラは、エスケープ分析を通じて、新しいオブジェクトの参照の使用範囲を分析し、このオブジェクトをヒープに割り当てるかどうかを決定できます。
エスケープ分析の基本原則は: オブジェクトの動的スコープを分析することです。オブジェクトがメソッド内で定義されている場合、オブジェクトは渡されるなどの外部メソッドによって参照される可能性があります。他のメソッドへの呼び出しパラメータとして使用することは、メソッド エスケープと呼ばれます。他のスレッドでアクセスできるインスタンス変数への代入など、外部スレッドからアクセスされることもあります。これはスレッド エスケープと呼ばれます。決してエスケープしない場合は、メソッド エスケープと呼ばれます。スレッドエスケープまで、オブジェクトの低レベルから高レベルまでの異なるエスケープレベルと呼ばれます。
エスケープ分析をオンにすると、コンパイラは次のようにコードを最適化できます:
同期削除: エスケープ分析によってオブジェクトが見つかった場合、スレッドによってのみアクセスでき、このオブジェクトに対する操作は非同期にすることができます。 スタック上の割り当て: オブジェクトがスレッドからエスケープされないことが確実な場合は、スタック上のオブジェクトにメモリを割り当てることをお勧めします。スタック フレームがポップされると、スペースが破壊される可能性があります。 スカラー置換: オブジェクトがエスケープ解析によって外部メソッドからアクセスできないことが判明し、そのオブジェクトが分解できる場合、プログラムが実際に実行されるときにオブジェクトが作成されない可能性があります。このメソッドではなく、いくつかのメンバー変数を使用して直接作成してください。 オブジェクトを分割した後、オブジェクトのメンバー変数をスタックに割り当て、読み書きすることができます。
JVM では、次のパラメータを使用してエスケープ分析を有効にするかどうかを指定できます。
-XX: DoEscapeAnalysis: 示します。そのエスケープは分析で有効になっています (JDK 1.7 以降はデフォルトで有効になっています)。
-XX:-DoEscapeAnalysis: エスケープ分析をオフにすることを示します。
同期の削除
スレッドの同期自体は、比較的時間のかかるプロセスです。エスケープ分析によって、変数がスレッドからエスケープされず、スレッドをエスケープできないことが判明した場合は、他のスレッド アクセスによって使用される場合、この変数の読み取りと書き込みに競合は存在しません。また、この変数に実装された同期手段は安全に削除できます。
次のコードのようなもの:
public void method() { Object o = new Object(); synchronized (o) { System.out.println(o); } }
オブジェクト o
をロックしますが、オブジェクト o のライフサイクルはメソッド method() と同じであるため、他のスレッドからアクセスされない場合、スレッド セーフティの問題は発生せず、JIT コンパイル フェーズは次のように最適化されます:
public void method() { Object o = new Object(); System.out.println(o); }
これは、ロック削除 とも呼ばれます。
スタック上の割り当て
Java 仮想マシンでは、オブジェクトを作成するためのメモリ空間がスタック上に割り当てられることは、ほとんどすべての Java プログラマが知っています。 Java ヒープ。常識的には、Java ヒープ内のオブジェクトは共有され、各スレッドから参照できます。このオブジェクトへの参照を保持している限り、ヒープに格納されているオブジェクト データにアクセスできます。仮想マシンのガベージ コレクション サブシステムは、ヒープ内で使用されなくなったオブジェクトをリサイクルしますが、リサイクル可能なオブジェクトのマーク付けとフィルタリング、メモリのリサイクルと整理など、リサイクル アクションには大量のリソースが必要です。ただし、特殊な場合があり、エスケープ解析によりオブジェクトがスレッドの外にエスケープしないことが確認された場合は、スタックへの割り当てが最適化されることがあります。これにより、ヒープ上にメモリを割り当てる必要がなくなり、ガベージ コレクションも必要なくなります。
次のコードのように:
public static void main(String[] args) throws InterruptedException { for (int i = 0; i < 1000000; i++) { alloc(); } Thread.sleep(100000); } private static void alloc() { User user = new User(); }
コードは非常に単純です。ループ内で 100 万回作成し、alloc() メソッドを使用して 100 万個の User オブジェクトを作成します。ここで alloc() メソッドで定義された User オブジェクトは他のメソッドから参照されないため、スタック上の割り当ての要件を満たします。
JVM パラメータは次のとおりです:
-Xmx2G -Xms2G -XX:+DoEscapeAnalysis -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError
プログラムを起動し、jmap ツールでインスタンスの数を確認します:
jmap -histo pid num #instances #bytes class name ---------------------------------------------- 1: 3771 2198552 [B 2: 10617 1722664 [C 3: 104057 1664912 com.miracle.current.lock.StackAllocationTest$User
プログラムがユーザー オブジェクトの合計は 104057 で、これは 100 万よりはるかに少ないです。エスケープ分析をオフにして、もう一度見てみましょう:
-Xmx2G -Xms2G -XX:-DoEscapeAnalysis -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError
プログラムを起動し、jmap ツールでインスタンスの数を確認します:
jmap -histo 42928 num #instances #bytes class name ---------------------------------------------- 1: 628 22299176 [I 2: 1000000 16000000 com.miracle.current.lock.StackAllocationTest$User
合計 100 万ユーザーであることがわかります。オブジェクトはエスケープ分析をオフにした後に作成されました。比較すると、スタック上の割り当ては、ヒープ メモリの消費と GC において重要な役割を果たします。
スカラー置換
データをより小さなデータに分解して表現できなくなった場合、Java 仮想マシンの元のデータ型 ( int、long、参照型などの数値型はそれ以上分解できないため、これらのデータはスカラーと呼ばれます。対照的に、データを分解し続けることができる場合、それは集合体と呼ばれ、Java のオブジェクトは典型的な集合体です。
エスケープ解析により、オブジェクトがメソッド外ではアクセスされず、このオブジェクトを分解できることが証明された場合、プログラムが実際に実行されるとき、このオブジェクトは作成されず、そのオブジェクトのいくつかが直接作成される可能性があります。 . 代わりにこのメソッドで使用されるメンバー変数。
には次のコードがあります:
public static void main(String[] args) { method(); } private static void method() { User user = new User(25); System.out.println(user.age); } private static class User { private int age; public User(int age) { this.age = age; } }
在method()
方法中创建User对象,指定age为25,这里User不会被其他方法引用,也就是说它不会逃逸出方法,并且User是可以拆解为标量的。所以alloc()
代码会优化为如下:
private static void alloc() { int age = 25; System.out.println(age); }
总结
尽管目前逃逸分析技术仍在发展之中,未完全成熟,但它是即时编译器优化技术的一个重要前进方向,在日后的Java虚拟机中,逃逸分析技术肯定会支撑起一系列更实用、有效的优化技术。
以上がJVM エスケープ分析を 3 分で理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホット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)

ホットトピック









このプロジェクトは、開発者が複数のリモート ホスト JVM をより速く監視できるように設計されています。プロジェクトが Spring Boot の場合、統合は非常に簡単です。jar パッケージを導入するだけです。Spring Boot でない場合でも、落胆する必要はありません。 Spring Boot プログラムを手早く初期化し、自分で導入する Jar パッケージで十分です

JVM コマンド ライン パラメータを使用すると、JVM の動作をきめ細かいレベルで調整できます。共通パラメータは次のとおりです。 Java ヒープ サイズの設定 (-Xms、-Xmx) 新しい世代サイズの設定 (-Xmn) パラレル ガベージ コレクタの有効化 (-XX:+UseParallelGC) Survivor 領域のメモリ使用量の削減 (-XX: -ReduceSurvivorSetInMemory) 冗長性の削除 ガベージ コレクションの削除 (-XX:-EliminateRedundantGCs) ガベージ コレクション情報の印刷 (-XX:+PrintGC) G1 ガベージ コレクターの使用 (-XX:-UseG1GC) ガベージ コレクションの最大休止時間の設定 (-XX:MaxGCPau)

JVM のメモリ使用量を使いこなすためのポイントと注意点 JVM (JavaVirtualMachine) は Java アプリケーションが動作する環境であり、最も重要なのは JVM のメモリ管理です。 JVM メモリを適切に管理すると、アプリケーションのパフォーマンスが向上するだけでなく、メモリ リークやメモリ オーバーフローなどの問題も回避できます。この記事では、JVM メモリ使用の重要なポイントと考慮事項を紹介し、いくつかの具体的なコード例を示します。 JVM メモリ パーティション JVM メモリは主に次の領域に分割されます。 ヒープ (ヒープ)

JVM 仮想マシンの機能と原理の分析の紹介: JVM (JavaVirtualMachine) 仮想マシンは、Java プログラミング言語の中核コンポーネントの 1 つであり、Java の最大のセールス ポイントの 1 つです。 JVM の役割は、Java ソース コードをバイトコードにコンパイルし、これらのバイトコードを実行することです。この記事では、JVM の役割とその仕組みを紹介し、読者の理解を深めるためにいくつかのコード例を示します。機能: JVM の主な機能は、さまざまなプラットフォーム上での Java プログラムの移植性の問題を解決することです。

Java は人気のあるプログラミング言語ですが、Java アプリケーションの開発中に、JVM メモリ オーバーフロー エラーが発生する場合があります。通常、このエラーによりアプリケーションがクラッシュし、ユーザー エクスペリエンスに影響を与えます。この記事では、JVM メモリ オーバーフロー エラーの原因と、そのようなエラーに対処および回避する方法について説明します。 JVMメモリオーバーフローエラーとは何ですか? Java 仮想マシン (JVM) は、Java アプリケーションの実行環境です。 JVM では、メモリはヒープ、メソッド領域、スタックなどの複数の領域に分割されます。ヒープは作成されたオブジェクトを保存するために使用されます

JVM メモリ パラメータ設定: ヒープ メモリ サイズを合理的に調整するにはどうすればよいですか? Java アプリケーションでは、JVM はメモリの管理を担当する主要なコンポーネントです。このうちヒープ メモリはオブジェクト インスタンスの保存に使用され、ヒープ メモリのサイズ設定はアプリケーションのパフォーマンスと安定性に重要な影響を与えます。この記事では、ヒープメモリサイズを合理的に調整する方法を具体的なコード例とともに紹介します。まず、JVM メモリに関する基本的な知識を理解する必要があります。 JVM のメモリは、ヒープ メモリ、スタック メモリ、メソッド領域などを含むいくつかの領域に分割されます。で

JVM が 32 ビットか 64 ビットかを確認する Java プログラムを作成する前に、まず JVM について説明します。 JVM は Java 仮想マシンであり、バイトコードの実行を担当します。これは Java ランタイム環境 (JRE) の一部です。 Java はプラットフォームに依存しませんが、JVM はプラットフォームに依存することは誰もが知っています。オペレーティング システムごとに個別の JVM が必要です。 Java ソース コードのバイトコードがあれば、JVM により任意のプラットフォームで簡単に実行できます。 Java ファイル実行のプロセス全体は次のとおりです。まず、Java ソース コードを .java 拡張子で保存し、コンパイラがそれを .class 拡張子を持つバイトコードに変換します。これはコンパイル時に発生します。さて、実行時に、J

JVM 原理の詳細な説明: Java 仮想マシンの動作原理を詳しく調べるには、特定のコード例が必要です。 1. はじめに Java プログラミング言語の急速な発展と広範な応用により、Java 仮想マシン (JavaVirtualMachine、JVM と呼ばれます) が登場しました。 )もソフトウェア開発には欠かせないものとなっています。 Java プログラムの実行環境として、JVM はクロスプラットフォーム機能を提供し、Java プログラムをさまざまなオペレーティング システムで実行できるようにします。この記事では、JVM の仕組みについて詳しく説明します。
