搜尋
首頁Javajava教程JVM的逃逸是什麼? JVM逃逸分析的原理介紹

這篇文章帶給大家的內容是關於JVM的逃逸是什麼? JVM逃逸分析的原理介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

我們都知道Java中的物件預設都是分配到堆疊上,在呼叫堆疊中,只保存了物件的指標。當物件不再使用後,需要依靠GC來遍歷引用樹並回收記憶體。如果堆中物件數量太多,回收物件還有整理內存,都會帶來時間上的消耗,GC表示壓力很大,然後影響效能。所以,在我們日常開發中,內存,時間都是相當的寶貴,該如何優化堆疊開銷,是一個比較重要的問題。

在這裡,我以逃逸分析角度聊聊JVM優化的事。

為什麼「逃逸

在電腦語言編譯器最佳化原理中,逃逸分析是指分析指標動態範圍的方法,它同編譯器最佳化原理的指標分析和外形分析相關聯。當變數(或物件)在方法中被指派後,其指標有可能被傳回或被全域引用,這樣就會被其他方法或執行緒所引用,這種現象稱作指標(或引用)的逃逸(Escape)。通俗點講,如果一個物件的指標被多個方法或線程引用時,那麼我們就稱這個物件的指標(或物件)的逃逸(Escape)。

網路上有位博友這麼形容逃逸,用了一段簡單直接的程式碼,我覺得挺直截了當的,可以供參考:

public StringBuilder escapeDemo1(System a, System b) {
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append(a);
    stringBuilder.append(b);
    return stringBuilder;
}

stringBuilder是在方法的內部變量,而此時它被直接傳回,這樣stringBuilder就有可能被其他地方的方法或參數所改變,這樣它的作用域就不只是demo1了,雖然它是一個局部變量,但其發生了「逃逸」。

那麼,我可以改一下程式碼:

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 Hotspot編譯器能夠分析出一個新的物件的引用的使用範圍從而決定是否要將這個物件指派到堆上。 逃逸分析(Escape Analysis)算是目前Java虛擬機器中比較前​​沿的最佳化技術了。

逃逸分析的原理

Java本身的限制(物件只能被分配到堆中),我可以這麼理解了,為了減少臨時物件在堆內分配的數量,我會在一個方法體內定義一個局部變量,並且該變量在方法執行過程中未發生逃逸,按照JVM調優機制,首先會在堆內存創建類的實例,然後將此對象的引用壓入呼叫棧,繼續執行,這是JVM優化前的方式。然後,我採用逃逸分析對JVM進行最佳化。即針對棧的重新分配方式,首先找出未逃逸的變量,將該變量直接存到棧裡,無需進入堆,分配完成後,繼續調用棧內執行,最後線程執行結束,棧空間被回收,局部變數也被回收了。如此操作,是優化前在堆中,優化後在堆疊中,從而減少了堆中物件的分配和銷毀,從而優化效能。

逃逸的方式

方法逃逸:在一個方法體內,定義一個局部變量,而它可能被外部方法引用,例如作為呼叫參數傳遞給方法,或作為對象直接回傳。或者,可以理解成物件跳出了方法。

執行緒逃逸:這個物件被其他執行緒存取到,例如賦值給了實例變量,並被其他執行緒存取到了。物件逃出了當前線程。

逃逸分析的好處

如果一個物件不會在方法體內,或執行緒內發生逃逸(或者說是透過逃逸分析後,使其未能發生逃逸)

1. 堆疊上分配

一般情況下,不會逃逸的物件所佔空間比較大,如果能使用堆疊上的空間,那麼大量的物件將隨方法的結束而銷毀,減輕了GC壓力

2. 同步消除

如果你定義的類別的方法上有同步鎖,但在運行時,卻只有一個執行緒在訪問,此時逃逸分析後的機器碼,會去掉同步鎖定運作。

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中文網其他相關文章!

陳述
本文轉載於:博客园。如有侵權,請聯絡admin@php.cn刪除
一个分布式 JVM 监控工具,非常实用!一个分布式 JVM 监控工具,非常实用!Aug 15, 2023 pm 05:15 PM

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

JVM虚拟机的作用及原理解析JVM虚拟机的作用及原理解析Feb 22, 2024 pm 01:54 PM

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

JVM内存管理要点与注意事项JVM内存管理要点与注意事项Feb 20, 2024 am 10:26 AM

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

Java程序检查JVM是32位还是64位Java程序检查JVM是32位还是64位Sep 05, 2023 pm 06:37 PM

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

Java错误:JVM内存溢出错误,如何处理和避免Java错误:JVM内存溢出错误,如何处理和避免Jun 24, 2023 pm 02:19 PM

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

揭秘JVM工作原理:深入探索Java虚拟机的原理揭秘JVM工作原理:深入探索Java虚拟机的原理Feb 18, 2024 pm 12:28 PM

JVM原理详解:深入探究Java虚拟机的工作原理,需要具体代码示例一、引言随着Java编程语言的迅猛发展和广泛应用,Java虚拟机(JavaVirtualMachine,简称JVM)也成为了软件开发中不可或缺的一部分。JVM作为Java程序的运行环境,能够提供跨平台的特性,使得Java程序能够在不同的操作系统上运行。在本文中,我们将深入探究JVM的工作原

如何有效地调整JVM堆内存大小?如何有效地调整JVM堆内存大小?Feb 18, 2024 pm 01:39 PM

JVM内存参数设置:如何合理调整堆内存大小?在Java应用程序中,JVM是负责管理内存的关键组件。其中,堆内存是用于存储对象实例的地方,堆内存的大小设置对应用程序的性能和稳定性有着重要影响。本文将介绍如何合理调整堆内存大小的方法,并附带具体代码示例。首先,我们需要了解一些关于JVM内存的基础知识。JVM的内存分成了几个区域,包括堆内存、栈内存、方法区等。其中

提升应用性能:五款不可或缺的JVM监控工具提升应用性能:五款不可或缺的JVM监控工具Feb 19, 2024 am 08:08 AM

五款必备JVM监控工具,让你的应用运行如虎添翼!在当今的软件开发领域,Java已经成为最受欢迎的编程语言之一。然而,随着应用程序的复杂性不断增加,如何保证应用程序的高性能和稳定运行成为了一个重要的挑战。为了解决这个问题,我们引入了一些JVM监控工具,这些工具可以帮助我们实时监控和调优应用程序的性能。本文将介绍五款必备的JVM监控工具,包括VisualVM、J

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。