国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

逃逸分析:解鎖性能的神秘鑰匙!

這篇具有很好參考價(jià)值的文章主要介紹了逃逸分析:解鎖性能的神秘鑰匙!。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

優(yōu)質(zhì)博文:IT-BLOG-CN

面試管坑位:在Java中新創(chuàng)建的對(duì)象一定是在堆上分配內(nèi)存嗎?如果你的答案是“是的”那就需要看看這個(gè)文章了。

一、簡(jiǎn)介

逃逸分析Escape Analysis:是一個(gè)很重要的JIT優(yōu)化技術(shù),用于判斷對(duì)象是否會(huì)在方法外部被訪問(wèn)到,也就是逃出方法的作用域。逃逸分析是JIT編譯器的一個(gè)步驟,通過(guò)JIT我們能夠確定哪些對(duì)象可以被限制在方法內(nèi)部使用,不會(huì)逃逸到外部,然后可以對(duì)它們進(jìn)行優(yōu)化,比如把它們分配在棧上而不是堆上,或者進(jìn)行標(biāo)量替換,把一個(gè)對(duì)象拆散成多個(gè)基本類型來(lái)存儲(chǔ)。是一種可以有效減少Java程序中同步負(fù)載內(nèi)存堆分配和垃圾回收壓力的跨函數(shù)全局?jǐn)?shù)據(jù)流分析算法。通過(guò)逃逸分析,Java Hotspot編譯器能夠分析出一個(gè)新對(duì)象的引用的使用范圍,而決定是否要將這個(gè)對(duì)象分配到堆上。

逃逸分析主要針對(duì)局部變量,判斷堆上分配的對(duì)象是否逃逸出方法的作用域。它同編譯器優(yōu)化原理的指針?lè)治龊屯庑畏治鱿嚓P(guān)聯(lián)。當(dāng)變量(或者對(duì)象)在方法中分配后,其指針有可能被返回或者被全局引用,這樣就會(huì)被其他方法或者線程所引用,這種現(xiàn)象稱作指針(或者引用)的逃逸Escape。通俗點(diǎn)講,如果一個(gè)對(duì)象的指針被多個(gè)方法或者線程引用時(shí),那么我們就稱這個(gè)對(duì)象的指針發(fā)生了逃逸。合理地設(shè)計(jì)代碼結(jié)構(gòu)和數(shù)據(jù)的使用方式能夠更好地利用逃逸分析來(lái)優(yōu)化程序的性能。我們還可以通過(guò)逃逸分析減少堆上分配對(duì)象的開(kāi)銷,提高內(nèi)存利用率。

逃逸分析不是直接的優(yōu)化手段,而是代碼分析手段。

二、逃逸分析的好處

【1】棧上分配,可以降低垃圾收集器運(yùn)行的頻率。
【2】同步消除,如果發(fā)現(xiàn)某個(gè)對(duì)象只能從一個(gè)線程可訪問(wèn),那么在這個(gè)對(duì)象上的操作可以不需要同步。
【3】標(biāo)量替換,把對(duì)象分解成一個(gè)個(gè)基本類型,并且內(nèi)存分配不再是分配在堆上,而是分配在棧上。這樣的好處有:減少內(nèi)存使用,因?yàn)椴挥蒙蓪?duì)象頭。程序內(nèi)存回收效率高,并且GC頻率也會(huì)減少。因此對(duì)于臨時(shí)對(duì)象或短期使用的對(duì)象,盡量使用局部變量來(lái)存儲(chǔ),以減少對(duì)象逃逸的可能性。對(duì)于復(fù)雜的數(shù)據(jù)結(jié)構(gòu),盡量使用基本類型、數(shù)組或集合類,以減少對(duì)象的分配和逃逸。
【4】使用final關(guān)鍵字來(lái)限制對(duì)象的可變性,這樣JIT編譯器更容易進(jìn)行逃逸分析和優(yōu)化。

三、why

棧上分配Stack Allocations:在Java虛擬機(jī)中,Java堆上分配創(chuàng)建對(duì)象的內(nèi)存空間幾乎是Java程序員都知道的常識(shí),Java堆中的對(duì)象對(duì)于各個(gè)線程都是共享和可見(jiàn)的,只要持有這個(gè)對(duì)象的引用,就可以訪問(wèn)到堆中存儲(chǔ)的對(duì)象數(shù)據(jù)。虛擬機(jī)的垃圾收集子系統(tǒng)會(huì)回收堆中不再使用的對(duì)象,但回收動(dòng)作無(wú)論是標(biāo)記篩選出可回收對(duì)象,還是回收和整理內(nèi)存,都需要耗費(fèi)大量資源。如果確定一個(gè)對(duì)象不會(huì)逃逸出線程之外,那讓這個(gè)對(duì)象在棧上分配內(nèi)存將會(huì)是一個(gè)很不錯(cuò)的主意,對(duì)象所占用的內(nèi)存空間就可以隨棧幀出棧而銷毀。在一般應(yīng)用中,完全不會(huì)逃逸的局部對(duì)象和不會(huì)逃逸出線程的對(duì)象所占的比例是很大的,如果能使用棧上分配,那大量的對(duì)象就會(huì)隨著方法的結(jié)束而自動(dòng)銷毀了,垃圾收集子系統(tǒng)的壓力將會(huì)下降很多。棧上分配可以支持方法逃逸,但不能支持線程逃逸。

標(biāo)量替換Scalar Replacement 若一個(gè)數(shù)據(jù)已經(jīng)無(wú)法再分解成更小的數(shù)據(jù)來(lái)表示了,Java虛擬機(jī)中的原始數(shù)據(jù)類型都不能再進(jìn)一步分解,那么這些數(shù)據(jù)就可以被稱為標(biāo)量。相對(duì)的,如果一個(gè)數(shù)據(jù)可以繼續(xù)分解,那它就被稱為聚合量Aggregate,Java中的對(duì)象就是典型的聚合量。如果把一個(gè)Java對(duì)象拆散,根據(jù)程序訪問(wèn)的情況,將其用到的成員變量恢復(fù)為原始類型來(lái)訪問(wèn),這個(gè)過(guò)程就稱為標(biāo)量替換。假如逃逸分析能夠證明一個(gè)對(duì)象不會(huì)被方法外部訪問(wèn),并且這個(gè)對(duì)象可以被拆散,那么程序真正執(zhí)行的時(shí)候?qū)⒖赡懿蝗?chuàng)建這個(gè)對(duì)象,而改為直接創(chuàng)建它的若干個(gè)被這個(gè)方法使用的成員變量來(lái)代替。將對(duì)象拆分后,除了可以讓對(duì)象的成員變量在棧上(棧上存儲(chǔ)的數(shù)據(jù),很大機(jī)會(huì)被虛擬機(jī)分配至物理機(jī)器的高速寄存器中存儲(chǔ))分配和讀寫(xiě)之外,還可以為后續(xù)進(jìn)一步的優(yōu)化手段創(chuàng)建條件。標(biāo)量替換可以視作棧上分配的一種特例,實(shí)現(xiàn)更簡(jiǎn)單(不用考慮整個(gè)對(duì)象完整結(jié)構(gòu)的分配),但對(duì)逃逸程度的要求更高,它不允許對(duì)象逃逸出方法范圍內(nèi)。

同步消除Synchronization Elimination 線程同步本身是一個(gè)相對(duì)耗時(shí)的過(guò)程,如果逃逸分析能夠確定一個(gè)變量不會(huì)逃逸出線程,無(wú)法被其他線程訪問(wèn),那么這個(gè)變量的讀寫(xiě)肯定就不會(huì)有競(jìng)爭(zhēng),對(duì)這個(gè)變量實(shí)施的同步措施也就可以安全地消除掉。需要注意的是:這種情況針對(duì)的是synchronized鎖,而對(duì)于Lock鎖,則JVM并不能消除。

代碼說(shuō)明: 但是在實(shí)際的應(yīng)用程序中,尤其是大型程序中反而發(fā)現(xiàn)實(shí)施逃逸分析可能出現(xiàn)效果不穩(wěn)定的情況,或分析過(guò)程耗時(shí)但卻無(wú)認(rèn)開(kāi)啟的選項(xiàng)。如果有需要用戶可以使用參數(shù)-XX:+DoEscapeAnalysis來(lái)手動(dòng)開(kāi)啟逃逸分析法有效判別出非逃逸對(duì)象而導(dǎo)致性能下降。

public class EscapeTest {
    /**
     * JIT編譯時(shí)會(huì)對(duì)代碼進(jìn)行逃逸分析
     * 并不是所有對(duì)象存放在堆區(qū),有的一部分存在線程??臻g
     * Person沒(méi)有逃逸
     */
    private static String alloc() {
        Person person = new Person();
        return person.toString();
    }

    /**
     * 同步省略(鎖消除)JIT編譯階段優(yōu)化,JIT經(jīng)過(guò)逃逸分析之后發(fā)現(xiàn)無(wú)線程安全問(wèn)題,就會(huì)做鎖消除
     */
    public void append(String str1, String str2) {
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(str1).append(str2);
    }

    /**
     * 標(biāo)量替換
     */
    private static void test2() {
        Point point = new Point(1,2);
        System.out.println("point.x="+point.getX()+"; point.y="+point.getY());
        // 編譯后的偽代碼,也就是常說(shuō)的內(nèi)聯(lián)后的樣子
        // int x=1;
        // int y=2;
        // System.out.println("point.x="+x+"; point.y="+y);
    }
}

四、結(jié)論

關(guān)于逃逸分析的研究論文早在1999年就已經(jīng)發(fā)表,但直到JDK 6,HotSpot才開(kāi)始支持初步的逃逸分析,而且到現(xiàn)在這項(xiàng)優(yōu)化技術(shù)尚未足夠成熟,仍有很大的改進(jìn)余地。不成熟的原因主要是逃逸分析的計(jì)算成本非常高,甚至不能保證逃逸分析帶來(lái)的性能收益會(huì)高于它的消耗。如果要百分之百準(zhǔn)確地判斷一個(gè)對(duì)象是否會(huì)逃逸,需要進(jìn)行一系列復(fù)雜的數(shù)據(jù)流敏感的過(guò)程間分析,才能確定程序各個(gè)分支執(zhí)行時(shí)對(duì)此對(duì)象的影響。前面介紹即時(shí)編譯、提前編譯優(yōu)劣勢(shì)時(shí)提到了過(guò)程間分析這種大壓力的分析算法正是即時(shí)編譯的弱項(xiàng)。可以試想一下,如果逃逸分析完畢后發(fā)現(xiàn)幾乎找不到幾個(gè)不逃逸的對(duì)象,那這些運(yùn)行期耗用的時(shí)間就白白浪費(fèi)了,所以目前虛擬機(jī)只能采用不那么準(zhǔn)確,但時(shí)間壓力相對(duì)較小的算法來(lái)完成分析。這個(gè)在JIT優(yōu)化實(shí)戰(zhàn)中有說(shuō)明。

jdk7開(kāi)始默認(rèn)開(kāi)啟逃逸分析。在Java代碼運(yùn)行時(shí),可以通過(guò)JVM參數(shù)指 定是否開(kāi)啟逃逸分析:

XX:+DoEscapeAnalysis //表示開(kāi)啟逃逸分析 (jdk1.8默認(rèn)開(kāi)啟)XX:DoEscapeAnalysis //表示關(guān)閉逃逸分析。XX:+EliminateAllocations //開(kāi)啟標(biāo)量替換(默認(rèn)打開(kāi))XX:+EliminateLocks //開(kāi)啟鎖消除(jdk1.8默認(rèn)開(kāi)啟)

開(kāi)啟逃逸與關(guān)閉逃逸的區(qū)別:
【1】關(guān)閉逃逸:-XX:-DoEscapeAnalysis -XX:+PrintGC

long start = System.currentTimeMillis();
for(int i=0;i<5000000;i++){
    newObject();
}
long end = System.currentTimeMillis();
System.out.println("耗時(shí)"+(end-start)+"毫秒");
Thread.sleep(100000);

結(jié)果:41毫秒,一次GC并且有一百多萬(wàn)的垃圾回收。

[GC (Allocation Failure)  65536K->880K(251392K), 0.0013300 secs]
耗時(shí)41毫秒

num  #instances    #bytes       class name
1:   1088834       17868374     java.lang.Object

【2】開(kāi)啟逃逸:-XX:+DoEscapeAnalysis -XX:+PrintGC 只有4毫秒,沒(méi)有GC,提高了快10倍效率,并且堆中只有十幾萬(wàn)。逃逸了

耗時(shí)4毫秒

num  #instances    #bytes       class name
1:   14534         2734633     java.lang.Object

可以發(fā)現(xiàn)一個(gè)逃逸和沒(méi)逃逸的問(wèn)題,只要是對(duì)象有被方法外部或者全局引用到那肯定會(huì)存在逃逸。當(dāng)對(duì)象沒(méi)有發(fā)生逃逸的時(shí)候,虛擬機(jī)會(huì)對(duì)其進(jìn)行優(yōu)化。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-742288.html

到了這里,關(guān)于逃逸分析:解鎖性能的神秘鑰匙!的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java對(duì)象逃逸及逃逸分析

    Java對(duì)象逃逸及逃逸分析

    文章目錄 前言 一、對(duì)象逃逸是什么? 1.1 概念 1.2 代碼分析 二、逃逸分析(一種分析算法) 1.什么是逃逸分析 2.代碼優(yōu)化實(shí)踐 2.2 同步鎖消除 2.3 標(biāo)量替換分析 總結(jié) 隨著 JIT 編譯器的發(fā)展與逃逸分析技術(shù)逐漸成熟, 棧上分配、標(biāo)量替換優(yōu)化 技術(shù)將會(huì)導(dǎo)致一些微妙的變化,所有的

    2024年02月05日
    瀏覽(13)
  • BUUCTF Misc 隱藏的鑰匙 & 另外一個(gè)世界 & FLAG & 神秘龍卷風(fēng)

    BUUCTF Misc 隱藏的鑰匙 & 另外一個(gè)世界 & FLAG & 神秘龍卷風(fēng)

    目錄 ? 隱藏的鑰匙? 另外一個(gè)世界 FLAG 神秘龍卷風(fēng) ? 下載文件 使用010 editor工具查看 查找flag 將內(nèi)容復(fù)制到base64在線 得到flag? ? ? ? ? ? ? ?flag{377cbadda1eca2f2f73d36277781f00a}? 下載文件 使用010 eitor查看 看到了一串二進(jìn)制,進(jìn)行二進(jìn)制轉(zhuǎn)換字符串 ?得到flag? ? ? ? ? flag{koekj3

    2024年02月07日
    瀏覽(26)
  • 小研究 - Java虛擬機(jī)性能及關(guān)鍵技術(shù)分析

    小研究 - Java虛擬機(jī)性能及關(guān)鍵技術(shù)分析

    利用specJVM98和Java Grande Forum Benchmark suite Benchmark集合對(duì)SJVM、IntelORP,Kaffe3種Java虛擬機(jī)進(jìn)行系統(tǒng)測(cè)試。在對(duì)測(cè)試結(jié)果進(jìn)行系統(tǒng)分析的基礎(chǔ)上,比較了不同JVM實(shí)現(xiàn)對(duì)性能的影響和JVM中關(guān)鍵模塊對(duì)JVM性能的影響,并提出了提高JVM性能的一些展望。 目錄 1? Java虛擬機(jī)的關(guān)鍵技術(shù) 1.1? 字

    2024年02月11日
    瀏覽(26)
  • 小研究 - Java虛擬機(jī)垃圾收集器的性能分析與調(diào)節(jié)

    小研究 - Java虛擬機(jī)垃圾收集器的性能分析與調(diào)節(jié)

    垃圾收集器是Java虛擬機(jī)(JVM)的核心組成部分之一,對(duì)Java虛擬機(jī)的性能有非常重要的影響。本文將介紹GC的工作原理以及對(duì)象回收算法,重點(diǎn)介紹JVM的分段回收技術(shù);剖析JVM自帶的GC性能分析工具;闡述如何通過(guò)命令行參數(shù)調(diào)節(jié)GC的運(yùn)行,提

    2024年02月11日
    瀏覽(25)
  • 解鎖Spring AOP的神秘面紗

    解鎖Spring AOP的神秘面紗

    Spring AOP作為Spring框架的核心模塊,為我們提供了一種優(yōu)雅的方式來(lái)處理橫切關(guān)注點(diǎn)。本篇博客將從組成、實(shí)現(xiàn)和實(shí)現(xiàn)原理三個(gè)方面深入剖析Spring AOP,并結(jié)合具體的例子進(jìn)行說(shuō)明。 切面(Aspect):切面是橫切關(guān)注點(diǎn)的具體實(shí)現(xiàn),它定義了在何處、何時(shí)執(zhí)行橫切邏輯。我們可以

    2024年02月12日
    瀏覽(20)
  • 解鎖互聯(lián)網(wǎng)安全的新鑰匙:JWT(JSON Web Token)

    解鎖互聯(lián)網(wǎng)安全的新鑰匙:JWT(JSON Web Token)

    目錄 前言 一、JWT簡(jiǎn)介 1. 什么是JWT? ?編輯 2. JWT的工作原理 3.JWT如何工作的 4. JWT的優(yōu)勢(shì) 5. 在實(shí)際應(yīng)用中使用JWT 6.傳統(tǒng)Session和JWT認(rèn)證的區(qū)別 6.1.session認(rèn)證方式 6.2.JWT認(rèn)證方式 7.基于Token的身份認(rèn)證 與 基于服務(wù)器的身份認(rèn)證? 二、JWT的結(jié)構(gòu) (1) Header (2) Payload (3) Signature ?三、

    2024年02月08日
    瀏覽(20)
  • 【jvm系列-13】jvm性能調(diào)優(yōu)篇---參數(shù)設(shè)置以及日志分析

    【jvm系列-13】jvm性能調(diào)優(yōu)篇---參數(shù)設(shè)置以及日志分析

    JVM系列整體欄目 內(nèi)容 鏈接地址 【一】初識(shí)虛擬機(jī)與java虛擬機(jī) https://blog.csdn.net/zhenghuishengq/article/details/129544460 【二】jvm的類加載子系統(tǒng)以及jclasslib的基本使用 https://blog.csdn.net/zhenghuishengq/article/details/129610963 【三】運(yùn)行時(shí)私有區(qū)域之虛擬機(jī)棧、程序計(jì)數(shù)器、本地方法棧 https

    2024年02月06日
    瀏覽(30)
  • 小研究 - JVM 逃逸技術(shù)與 JRE 漏洞挖掘研究(一)

    小研究 - JVM 逃逸技術(shù)與 JRE 漏洞挖掘研究(一)

    Java語(yǔ)言是最為流行的面向?qū)ο缶幊陶Z(yǔ)言之一, Java運(yùn)行時(shí)環(huán)境(JRE)擁有著非常大的用戶群,其安全問(wèn)題十分重要。近年來(lái),由JRE漏洞引發(fā)的JVM逃逸攻擊事件不斷增多,對(duì)個(gè)人計(jì)算機(jī)安全造成了極大的威脅。研究JRE安全機(jī)制、JRE漏洞及其挖掘、JVM逃逸攻防技術(shù)逐漸成為軟件安

    2024年02月11日
    瀏覽(18)
  • JVM:性能監(jiān)控工具分析和線上問(wèn)題排查實(shí)踐

    JVM:性能監(jiān)控工具分析和線上問(wèn)題排查實(shí)踐

    在日常開(kāi)發(fā)過(guò)程中,多少都會(huì)碰到一些jvm相關(guān)的問(wèn)題,比如: 內(nèi)存溢出、內(nèi)存泄漏、cpu利用率飆升到100%、線程死鎖、應(yīng)用異常宕機(jī) 等。 在這個(gè)日益內(nèi)卷的環(huán)境,如何運(yùn)用好工具分析jvm問(wèn)題,成為每個(gè)java攻城獅必備的技能。所以白夢(mèng)特意整理了 jdk自帶分析工具的使用 ,以及

    2024年01月19日
    瀏覽(27)
  • JVM(Java虛擬機(jī))

    JVM(Java虛擬機(jī))

    目錄 1.JVM 簡(jiǎn)介 2. JVM 運(yùn)行時(shí)數(shù)據(jù)區(qū) 2.1程序計(jì)數(shù)器 2.棧 3.堆 4.方法區(qū) 3.類加載 1.loading 2.linking 1.驗(yàn)證 2.準(zhǔn)備 3.解析 3.Initializing 4.雙親委派模型 5.JVM垃圾回收機(jī)制 1.劣勢(shì) 2.回收什么 3.垃圾回收具體怎么回收 1.找垃圾 方法: 問(wèn)題: 2.釋放垃圾 JVM 是 Java Virtual Machine 的簡(jiǎn)稱,意為 Java虛

    2024年02月01日
    瀏覽(43)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包