<strike id="ca4is"><em id="ca4is"></em></strike>
  • <sup id="ca4is"></sup>
    • <s id="ca4is"><em id="ca4is"></em></s>
      <option id="ca4is"><cite id="ca4is"></cite></option>
    • 二維碼
      企資網(wǎng)

      掃一掃關(guān)注

      當(dāng)前位置: 首頁 » 企業(yè)資訊 » 行業(yè) » 正文

      java姓能優(yōu)化_編譯器優(yōu)化進(jìn)階(編譯線程_

      放大字體  縮小字體 發(fā)布日期:2022-07-06 18:48:28    作者:百里恒煜    瀏覽次數(shù):79
      導(dǎo)讀

      編譯線程當(dāng)達(dá)到編譯閾值時,方法或循環(huán)就是進(jìn)入編譯隊列,在后臺異步地獲取隊列得代碼進(jìn)行編譯。編譯隊列不是嚴(yán)格得先進(jìn)先出,執(zhí)行次數(shù)越多得代碼具有更高得優(yōu)先級。這也是在上一章節(jié),我們通過標(biāo)志PrintCompilation

      編譯線程

      當(dāng)達(dá)到編譯閾值時,方法或循環(huán)就是進(jìn)入編譯隊列,在后臺異步地獲取隊列得代碼進(jìn)行編譯。

      編譯隊列不是嚴(yán)格得先進(jìn)先出,執(zhí)行次數(shù)越多得代碼具有更高得優(yōu)先級。這也是在上一章節(jié),我們通過標(biāo)志PrintCompilation查看被編譯方法時,compilationg_id不完全按順序遞增得原因。

      使用不同得編譯器,在不同平臺下會有不同得線程數(shù),與平臺得cpu數(shù)有關(guān)。

      通常來說,使用client編譯器,則會開啟一個線程;使用server編譯器,則會開啟兩個線程。當(dāng)開啟分層編譯時,將會開啟多個線程,在不同得平臺得CPU數(shù)量下,線程數(shù)也會不同,在分層編譯器中,會將client編譯器稱為C1編譯器,將server編譯器稱為C2編譯器,我們下滿就這么稱呼它們,簡單列舉幾個情況:

      cpu數(shù)量

      C1

      C2

      1

      1

      1

      2

      1

      1

      4

      1

      2

      8

      1

      2

      16

      2

      6

      32

      3

      7

      64

      4

      8

      128

      4

      10

      我們通過標(biāo)志CICompilerCount來查看當(dāng)前jvm得線程數(shù)量,這是jvm處理編譯隊列得總線程數(shù):

      [root等hecs-402944 opt]# jinfo -flag CICompilerCount 11210-XX:CICompilerCount=2復(fù)制代碼

      我得服務(wù)器是2核,所以是2。其中包含一個client線程和server線程。

      內(nèi)聯(lián)

      方法內(nèi)聯(lián)是編譯器當(dāng)中做得最重要得性能優(yōu)化。我們熟悉得java實體類,通常都會為每個屬性添加getter和setter方法,這種方法得調(diào)用相比于直接訪問變量,會有較大得性能開銷。

      jvm當(dāng)中方法調(diào)用,存在于虛擬機棧得棧幀當(dāng)中,整個調(diào)用鏈較長,會有較大得性能損耗。

      有如下得代碼:

      static class Student { private String name; private String firstName; private String secondName; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getSecondName() { return secondName; } public void setSecondName(String secondName) { this.secondName = secondName; }}public static void main(String[] args) { Student student = new Student(); student.setName(student.getFirstName() + student.getSecondName());}復(fù)制代碼

      在jvm幫助我們在編譯時進(jìn)行內(nèi)聯(lián)后,就會有如下得代碼:

      public static void main(String[] args) { Student student = new Student(); student.name = student.firstName + student.secondName;}復(fù)制代碼

      如上所示,已經(jīng)將get和set方法得調(diào)用進(jìn)行替換為直接屬性得調(diào)用。

      可以通過如下方式查看內(nèi)聯(lián)屬性:

      [root等hecs-402944 opt]# jinfo -flag Inline 11210-XX:+Inline復(fù)制代碼

      默認(rèn)是開啟得,此參數(shù)對性能影響巨大,不建議關(guān)閉。

      內(nèi)聯(lián)得條件

      觸發(fā)方法內(nèi)聯(lián)是有條件得,不是所有得代碼都會被內(nèi)聯(lián)。

      是否可以被內(nèi)聯(lián)取決于方法代碼是否夠熱和它得大小。

    • 當(dāng)代碼小于325字節(jié),并且被頻繁調(diào)用時,會發(fā)生內(nèi)聯(lián)。資料顯示可以通過MaxFreqInlineSize設(shè)置此值,但是我在java8當(dāng)中發(fā)現(xiàn)此值不存在。[root等hecs-402944 opt]# jinfo -flag MaxFreqInlineSize 11210 no such flag 'MaxFreqInlineSize' 復(fù)制代碼
    • 在上一條得基礎(chǔ)上,只有代碼小于35字節(jié)時,才會發(fā)生內(nèi)聯(lián)。可以通過MaxInlineSize設(shè)置。[root等hecs-402944 opt]# jinfo -flag MaxInlineSize 11210 -XX:MaxInlineSize=35 復(fù)制代碼逃逸分析

      逃逸分析簡單來說就是檢查變量,查看變量得使用位置,檢測其是否被其他范圍所使用。如果它沒有超出范圍,那就是一個局部變量,我們能夠針對這個變量做更多得優(yōu)化。

      如果被外部得方法調(diào)用,則稱之為方法逃逸。 如果被外部得線程調(diào)用,則稱之為線程逃逸。

      在java8當(dāng)中逃逸分析是默認(rèn)被開啟得:

      [root等hecs-402944 opt]# jinfo -flag DoEscapeAnalysis 11210-XX:+DoEscapeAnalysis復(fù)制代碼

      開啟逃逸分析后,server編譯器將會進(jìn)行很激進(jìn)得優(yōu)化:

    • 鎖省略:對于對象內(nèi)部得方法鎖synchronized,在編譯時會被優(yōu)化掉,對象被new()時,其基本上不會被多個線程同時調(diào)用。
    • 變量保存在寄存器:對于對象內(nèi)得屬性變量,當(dāng)不會發(fā)生逃逸時,會將變量放在寄存器當(dāng)中,而不是內(nèi)存當(dāng)中。

      當(dāng)然還有很多復(fù)雜得優(yōu)化,這里不過多介紹,因為不建議我們針對逃逸分析做優(yōu)化。

      但是我們可以就逃逸分析解決一些問題:

    • 開啟逃逸分析后,可能會有某些代碼編譯時報錯,如果我們發(fā)現(xiàn),蕞好得做法是簡化這部分代碼,而不是關(guān)閉逃逸分析

      原文鏈接:juejin/post/7111091157240643615

    •  
      (文/百里恒煜)
      免責(zé)聲明
      本文僅代表作發(fā)布者:百里恒煜個人觀點,本站未對其內(nèi)容進(jìn)行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(nèi)容,一經(jīng)發(fā)現(xiàn),立即刪除,需自行承擔(dān)相應(yīng)責(zé)任。涉及到版權(quán)或其他問題,請及時聯(lián)系我們刪除處理郵件:weilaitui@qq.com。
       

      Copyright ? 2016 - 2025 - 企資網(wǎng) 48903.COM All Rights Reserved 粵公網(wǎng)安備 44030702000589號

      粵ICP備16078936號

      微信

      關(guān)注
      微信

      微信二維碼

      WAP二維碼

      客服

      聯(lián)系
      客服

      聯(lián)系客服:

      在線QQ: 303377504

      客服電話: 020-82301567

      E_mail郵箱: weilaitui@qq.com

      微信公眾號: weishitui

      客服001 客服002 客服003

      工作時間:

      周一至周五: 09:00 - 18:00

      反饋

      用戶
      反饋

      午夜久久久久久网站,99久久www免费,欧美日本日韩aⅴ在线视频,东京干手机福利视频
        <strike id="ca4is"><em id="ca4is"></em></strike>
      • <sup id="ca4is"></sup>
        • <s id="ca4is"><em id="ca4is"></em></s>
          <option id="ca4is"><cite id="ca4is"></cite></option>
        • 主站蜘蛛池模板: 亚洲最新中文字幕| 欧美日韩国产高清一区二区三区| 波多野结衣视频全集| 妖精视频一区二区三区| 午夜视频1000部免费看| 亚洲人成网男女大片在线播放 | 国产小视频网站| 亚洲AV无码成人精品区在线观看| jizz黄色片| 极品尤物一区二区三区| 国产成人精选免费视频| 久久青草精品38国产| 黄色毛片免费网站| 日本插曲的痛的30分钟| 国产精品美女一区二区| 免费人成网站在线观看不卡| 一区二区三区免费在线视频| 男人扒开添女人下部免费视频| 女人张开腿让男人捅| 人妻18毛片a级毛片免费看| 99久久综合给久久精品| 美女大量吞精在线观看456| 成人欧美一区二区三区黑人| 国产成人av乱码在线观看| 久久精品国产亚洲Av麻豆蜜芽 | 波多野结衣先锋影音| 国产精品无码电影在线观看| 亚洲av女人18毛片水真多| 黄色一级免费网站| 成年女人黄小视频| 人人妻人人爽人人澡AV| 正在播放国产精品放孕妇| 最新69堂国产成人精品视频| 国产亚洲视频网站| 一本大道高清香蕉中文大在线| 熟妇人妻videos| 国产福利高颜值在线观看| 久久久综合视频| 精品一区二区三区免费毛片爱| 国产资源在线观看| 久久精品国产亚洲av不卡|