この記事は JVM エスケープに関するものですか? JVM エスケープ分析の原理の紹介は、必要な方に参考にしていただけると幸いです。
Java のオブジェクトはデフォルトでヒープに割り当てられ、呼び出しスタックにはオブジェクトのポインタのみが保存されることは誰もが知っています。オブジェクトが使用されなくなった場合は、参照ツリーを走査してメモリを再利用するために GC を利用する必要があります。ヒープ内のオブジェクトが多すぎると、オブジェクトのリサイクルとメモリの整理に大きな負荷がかかり、パフォーマンスに影響します。したがって、日々の開発においては、メモリと時間が非常に貴重であり、スタックのオーバーヘッドをいかに最適化するかが比較的重要な問題となります。
ここでは、エスケープ分析の観点から JVM の最適化について説明します。
なぜ「Escape」
コンピュータ言語コンパイラ最適化の原理では、エスケープ解析とはポインタのダイナミック レンジを解析する方法を指します。コンパイラの最適化原則がポインタ解析とシェイプ解析に関連しているのと同じです。変数 (またはオブジェクト) がメソッドに割り当てられると、そのポインターがグローバルに返されたり参照されたりすることがあります。この現象は、ポインター (または参照) エスケープと呼ばれます。平たく言えば、オブジェクトのポインターが複数のメソッドまたはスレッドによって参照される場合、それをオブジェクトのポインター (またはオブジェクト) のエスケープと呼びます。
インターネット上のブロガーは、シンプルで直接的なコードを使用してこの方法でエスケープを説明しました。これは非常に簡単で参考にできると思います。
public StringBuilder escapeDemo1(System a, System b) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(a); stringBuilder.append(b); return stringBuilder; }
stringBuilder は、メソッドとこのメソッドが直接返された場合、stringBuilder は他のメソッドやパラメータによって変更される可能性があるため、スコープはローカル変数ですが「エスケープ」されます。
次に、コードを変更します。
public String escapeDemo2(System a, System b) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(a); stringBuilder.append(b); return stringBuilder.toString(); }
このようにすると、StringBuilder は返されず、toString() が返されます。この場合、StringBuilder はメソッドから直接分離されず、エスケープは発生しません。
エスケープ分析とは
エスケープ分析は、Java プログラムにおける同期負荷とメモリ ヒープ割り当てのプレッシャーを効果的に軽減できる機能横断的なグローバル データ フローです。分析アルゴリズム。 Java ホットスポット コンパイラは、エスケープ分析を通じて、新しいオブジェクトの参照の使用範囲を分析し、このオブジェクトをヒープに割り当てるかどうかを決定できます。エスケープ分析は現在、Java 仮想マシンにおける比較的最先端の最適化テクノロジです。
エスケープ解析の原理
一時的なメモリの割り当てを減らすための、Java 自体の制限 (オブジェクトはヒープにしか配置できない) は理解できます。ヒープ内のオブジェクト数。メソッド本体にローカル変数を定義します。この変数は、メソッドの実行中にエスケープされません。JVM チューニング メカニズムに従って、クラスのインスタンスが最初にヒープ内に作成されます。その後、このオブジェクトの参照が呼び出しスタックにプッシュされ、実行を継続します。これは、JVM 最適化の前の方法です。次に、エスケープ分析を使用して JVM を最適化します。つまり、スタックの再割り当て方法では、まずエスケープされていない変数を見つけ、その変数をヒープに入れずにスタックに直接格納します。最後に、スレッドの実行のためにスタックを呼び出し続けます。終了すると、スタック領域がリサイクルされ、ローカル変数もリサイクルされます。この操作は、最適化前はヒープ内にあり、最適化後はスタック内にあるため、ヒープ内のオブジェクトの割り当てと破棄が削減され、パフォーマンスが最適化されます。
エスケープ方法
メソッド エスケープ: メソッド本体で、メソッドに渡されるなど、外部メソッドによって参照されるローカル変数を定義します。呼び出しパラメータとして、またはオブジェクトとして直接返されます。あるいは、メソッドからオブジェクトが飛び出しているとも理解できます。
スレッド エスケープ: このオブジェクトは、インスタンス変数に割り当てられたり、他のスレッドによってアクセスされたりするなど、他のスレッドによってアクセスされます。オブジェクトは現在のスレッドからエスケープされました。
エスケープ分析の利点
オブジェクトがメソッド本体内またはスレッド内でエスケープしない場合 (またはエスケープ分析を通過した後にエスケープが発生しない場合) エスケープ)
1. スタック上の割り当て
一般に、スタック上のスペースが使用できる場合、エスケープされないオブジェクトは比較的大きなスペースを占めます。メソッドは最後に破棄され、GC プレッシャーが軽減されます。
2. 定義したクラスのメソッドに同期ロックがある場合、実行時には 1 つのスレッドのみがロックされます。アクセスすると、この時点では、エスケープ解析後のマシンコードは同期ロックなしで実行されます。
3. スカラー置換
Java虚拟机中的原始数据类型(int,long等数值类型以及reference类型等)都不能再进一步分解,它们可以称为标量。相对的,如果一个数据可以继续分解,那它称为聚合量,Java中最典型的聚合量是对象。如果逃逸分析证明一个对象不会被外部访问,并且这个对象是可分解的,那程序真正执行的时候将可能不创建这个对象,而改为直接创建它的若干个被这个方法使用到的成员变量来代替。拆散后的变量便可以被单独分析与优化,可以各自分别在栈帧或寄存器上分配空间,原本的对象就无需整体分配空间了。
开启设置
在JDK 6u23以上是默认开启,这里将设置重新明确一下:
强制开启:
-server -XX:+DoEscapeAnalysis -XX:+PrintGCDetail -Xmx10m -Xms10m
关闭逃逸分析:
-server -XX:-DoEscapeAnalysis -XX:+PrintGCDetail -Xmx10m -Xms10m
写在结尾
栈上的空间一般而言是非常小的,只能存放若干变化和小的数据结构,无法存储大容量数据。目前的实现都是采用不那么准确但是时间压力相对较小的算法来完成逃逸分析,这就可能导致效果不稳定。所以,逃逸分析的效果只能在特定场景下,满足高频和高数量的小容量的变量分配结构,才是合适的。
以上がJVMエスケープとは何ですか? JVM エスケープ分析の原理の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

该项目为了方便开发者更快监控多个远程主机jvm,如果你的项目是Spring boot那么很方便集成,jar包引入即可,不是Spring boot也不用气馁,你可以快速自行初始化一个Spirng boot程序引入jar包即可

JVM虚拟机的作用及原理解析简介:JVM(JavaVirtualMachine)虚拟机是Java编程语言的核心组成部分之一,它是Java的最大卖点之一。JVM的作用是将Java源代码编译成字节码,并负责执行这些字节码。本文将介绍JVM的作用及其工作原理,并提供一些代码示例以帮助读者更好地理解。作用:JVM的主要作用是解决了不同平台上Java程序的可移

掌握JVM内存使用情况的要点与注意事项JVM(JavaVirtualMachine)是Java应用程序运行的环境,其中最为重要的就是JVM的内存管理。合理地管理JVM内存不仅可以提高应用程序的性能,还可以避免内存泄漏和内存溢出等问题。本文将介绍JVM内存使用的要点和注意事项,并提供一些具体的代码示例。JVM内存分区JVM内存主要分为以下几个区域:堆(He

在编写java程序来检查JVM是32位还是64位之前,我们先讨论一下JVM。JVM是java虚拟机,负责执行字节码。它是Java运行时环境(JRE)的一部分。我们都知道java是平台无关的,但是JVM是平台相关的。我们需要为每个操作系统提供单独的JVM。如果我们有任何java源代码的字节码,由于JVM,我们可以轻松地在任何平台上运行它。java文件执行的整个过程如下-首先,我们保存扩展名为.java的java源代码,编译器将其转换为扩展名为.class的字节码。这发生在编译时。现在,在运行时,J

Java是一种流行的编程语言,在开发Java应用程序的过程中,可能会遇到JVM内存溢出错误。这种错误通常会导致应用程序崩溃,影响用户体验。本文将探讨JVM内存溢出错误的原因和如何处理和避免这种错误。JVM内存溢出错误是什么?Java虚拟机(JVM)是Java应用程序的运行环境。在JVM中,内存被分为多个区域,其中包括堆、方法区、栈等。堆是用于存储创建的对象的

Tomcat8如何修改JVM内存配置Tomcat并不建议直接在catalina.sh里配置变量,而是写在与catalina同级目录(bin目录)下的setenv.sh里。所以如果我们想要修改jvm的内存配置那么我们就需要修改setenv.sh文件(默认没有,需新建一个setenv.sh),写入(大小根据自己情况修改):exportCATALINA_OPTS="$CATALINA_OPTS-Xms1000m"exportCATALINA_OPTS="$CATALINA

jvm的垃圾回收机制是GC(Garbage Collection),也叫垃圾收集器。GC基本原理:将内存中不再被使用的对象进行回收;GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、老年代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停。

Java是一种广泛使用的编程语言,它在开发大型软件系统中扮演着重要角色。与其他编程语言不同,Java采用了一种独特的内存管理方式,即垃圾回收机制。这种机制可以自动处理内存分配和释放,使得Java在编写程序时会更为方便和舒适。然而,在使用Java时,有时候会遇到JVM分配错误的情况。JVM(JavaVirtualMachine)是Java虚拟机的缩写,是执


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

Dreamweaver Mac版
ビジュアル Web 開発ツール

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

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