日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

小师妹学JVM之:JIT中的LogCompilation

發布時間:2024/2/28 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 小师妹学JVM之:JIT中的LogCompilation 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 簡介
  • LogCompilation簡介
  • LogCompilation的使用
  • 解析LogCompilation文件
  • 總結

簡介

我們知道在JVM中為了加快編譯速度,引入了JIT即時編譯的功能。那么JIT什么時候開始編譯的,又是怎么編譯的,作為一個高傲的程序員,有沒有辦法去探究JIT編譯的秘密呢?答案是有的,今天和小師妹一起帶大家來看一看這個編譯背后的秘密。

更多精彩內容且看:

  • 區塊鏈從入門到放棄系列教程-涵蓋密碼學,超級賬本,以太坊,Libra,比特幣等持續更新
  • Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續更新
  • Spring 5.X系列教程:滿足你對Spring5的一切想象-持續更新
  • java程序員從小工到專家成神之路(2020版)-持續更新中,附詳細文章教程

LogCompilation簡介

小師妹:F師兄,JIT這么神器,但是好像就是一個黑盒子,有沒有辦法可以探尋到其內部的本質呢?

追求真理和探索精神是我們作為程序員的最大優點,想想如果沒有玻爾關于原子結構的新理論,怎么會有原子體系的突破,如果沒有海森堡的矩陣力學,怎么會有量子力學的建立?

JIT的編譯日志輸出很簡單,使用 -XX:+LogCompilation就夠了。

如果要把日志重定向到一個日志文件中,則可以使用-XX:LogFile= 。

但是要開啟這些分析的功能,又需要使用-XX:+UnlockDiagnosticVMOptions。 所以總結一下,我們需要這樣使用:

-XX:+UnlockDiagnosticVMOptions -XX:+LogCompilation -XX:LogFile=www.flydean.com.log

LogCompilation的使用

根據上面的介紹,我們現場來生成一個JIT的編譯日志,為了體現出專業性,這里我們需要使用到JMH來做性能測試。

JMH的全稱是Java Microbenchmark Harness,是一個open JDK中用來做性能測試的套件。該套件已經被包含在了JDK 12中。

如果你使用的不是JDK 12,那么需要添加如下依賴:

<dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-core</artifactId><version>1.19</version> </dependency> <dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-generator-annprocess</artifactId><version>1.19</version> </dependency>

更多詳情可以參考我之前寫的: 在java中使用JMH(Java Microbenchmark Harness)做性能測試一文。

之前有的朋友說,代碼也用圖片,看起來好看,從本文之后,我們會盡量把代碼也轉成圖片來展示:

看完我的JMH的介紹,上面的例子應該很清楚了,主要就是做一個累加操作,然后warmup 5輪,測試5輪。

在@Fork注解里面,我們可以配置jvm的參數,為什么我注釋掉了呢?因為我發現在jvmArgsPrepend中的-XX:LogFile是不生效的。

沒辦法,我只好在運行配置中添加:

運行之后,你就可以得到輸出的編譯日志文件。

解析LogCompilation文件

小師妹:F師兄,我看了一下生成的文件好復雜啊,用肉眼能看得明白嗎?

別怕,只是內容的多一點,如果我們細細再細細的分析一下,你會發現其實它真的非常非常…復雜!

其實寫點簡單的小白文不好嗎?為什么要來分析這么復雜,又沒人看,看了也沒人懂的JVM底層…

大概,這就是專業吧!

LogCompilation文件其實是xml格式的,我們現在來大概分析一下,它的結構,讓大家下次看到這個文件也能夠大概了解它的重點。

首先最基本的信息就是JVM的信息,包括JVM的版本,JVM運行的參數,還有一些properties屬性。

我們收集到的日志其實是分兩類的,第一類是應用程序本身的的編譯日志,第二類就是編譯線程自己內部產生的日志。

第二類的日志會以hs_c*.log的格式存儲,然后在JVM退出的時候,再將這些文件跟最終的日志輸出文件合并,生成一個整體的日志文件。

比如下面的兩個就是編譯線程內部的日志:

<thread_logfile thread='22275' filename='/var/folders/n5/217y_bgn49z18zvjch907xb00000gp/T//hs_c22275_pid83940.log'/> <thread_logfile thread='41731' filename='/var/folders/n5/217y_bgn49z18zvjch907xb00000gp/T//hs_c41731_pid83940.log'/>

上面列出了編譯線程的id=22275,如果我們順著22275找下去,則可以找到具體編譯線程的日志:

<compilation_log thread='22275'> ... </compilation_log>

上面由compilation_log圍起來的部分就是編譯日志了。

接下來的部分表示,編譯線程開始執行了,其中stamp表示的是啟動時間,下圖列出了一個完整的編譯線程的日志:

<start_compile_thread name='C2 CompilerThread0' thread='22275' process='83940' stamp='0.058'/>

接下來描述的是要編譯的方法信息:

<task compile_id='10' method='java.lang.Object <init> ()V' bytes='1' count='1409' iicount='1409' stamp='0.153'>

上面列出了要編譯的方法名,compile_id表示的是系統內部分配的編譯id,bytes是方法中的字節數,count表示的是該方法的調用次數,注意,這里的次數并不是方法的真實調用次數,只能做一個估計。

iicount是解釋器被調用的次數。

task執行了,自然就會執行完成,執行完成的內容是以task_done標簽來表示的:

<task_done success='1' nmsize='120' count='1468' stamp='0.155'/>

其中success表示是否成功執行,nmsize表示編譯器編譯出來的指令大小,以byte為單位。如果有內聯的話,還有個inlined_bytes屬性,表示inlined的字節個數。

<type id='1025' name='void'/>

type表示的是方法的返回類型。

<klass id='1030' name='java.lang.Object' flags='1'/>

klass表示的是實例和數組類型。

<method id='1148' holder='1030' name='<init>' return='1025' flags='1' bytes='1' compile_id='1' compiler='c1' level='3' iicount='1419'/>

method表示執行的方法,holder是前面的klass的id,表示的是定義該方法的實例或者數組對象。method有名字,有
return,return對應的是上面的type。

flags表示的是方法的訪問權限。

接下來是parse,是分析階段的日志:

<parse method='1148' uses='1419.000000' stamp='0.153'>

上面有parse的方法id。uses是使用次數。

<bc code='177' bci='0'/>

bc是byte Count的縮寫,code是byte的個數,bci是byte code的索引。

<dependency type='no_finalizable_subclasses' ctxk='1030'/>

dependency分析的是類的依賴關系,type表示的是什么類型的依賴,ctkx是依賴的context class。

我們注意有的parse中,可能會有uncommon_trap:

<uncommon_trap bci='10' reason='unstable_if' action='reinterpret' debug_id='0' comment='taken never'/>

怎么理解uncommon_trap呢?字面上意思就是捕獲非常用的代碼,就是說在解析代碼的過程中發現發現這些代碼是uncommon的,然后解析產生一個uncommon_trap,不再繼續進行了。

它里面有兩個比較重要的字段,reason表示的是被標記為uncommon_trap的原因。action表示的出發uncommon_trap的事件。

有些地方還會有call:

<call method='1150' count='5154' prof_factor='1.000000' inline='1'/>

call的意思是,在該代碼中將會調用其他的方法。count是執行次數。

總結

復雜的編譯日志終于講完了,可能講的并不是很全,還有一些其他情況這里并沒有列出來,后面如果遇到了,我再添加進去。

本文的例子https://github.com/ddean2009/learn-java-base-9-to-20

本文作者:flydean程序那些事

本文鏈接:http://www.flydean.com/jvm-jit-logcompilation/

本文來源:flydean的博客

歡迎關注我的公眾號:程序那些事,更多精彩等著您!

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的小师妹学JVM之:JIT中的LogCompilation的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产三级三级在线观看 | www.精品久久 | 日本性xxxxx| 亚洲免费国产 | 中文字幕专区 | 人妻少妇一区二区 | 欧美xxxxbbbb| 18岁禁黄网站 | 成人av影视在线观看 | 久久午夜无码鲁丝片午夜精品 | 无码日韩精品一区二区 | 亚洲天堂av影院 | 涩久久| 做a爰小视频 | 人人澡人人射 | 成人一区二区在线观看 | www色天使| 日韩欧美a级片 | 天天夜夜啦啦啦 | 国产精品波多野结衣 | 波多野结av衣东京热无码专区 | 成人在线观看免费高清 | 国产三级按摩推拿按摩 | 人妻一区二区三区 | 国产精品传媒麻豆hd | 韩国av网 | 国产一区精品视频 | 亚洲做受高潮 | 38激情| 亚洲色图14p | 免费看一级黄色片 | 免费看一级黄色大全 | 日本男人天堂 | 韩国三色电费2024免费吗怎么看 | 免费看黄色三级 | 青青草原在线免费 | 鲁一鲁在线视频 | xxxxwwww在线观看 | 欧色av| 激情欧美一区 | 亚洲 自拍 另类 欧美 丝袜 | 欧美sm视频| 国产探花在线精品一区二区 | 亚洲精品美女久久久 | 欧美一区二区三区大屁股撅起来 | 嫩操影院| 在线视频三区 | 亚洲天堂男人天堂 | 色老妹 | 91亚色视频 | 人妻熟女一区二区三区 | 欧美日韩一卡二卡三卡 | 国产嫩草影院久久久 | 人人澡澡人人 | 国产一区色 | 无码人妻精品一区二区三应用大全 | 美女啪啪免费视频 | 国产成人无码精品久在线观看 | 欧美另类天堂 | 国产乡下妇女做爰视频 | 九九热这里有精品视频 | 金瓶狂野欧美性猛交xxxx | 97超碰总站 | 成人在线观看网站 | 欧美中文字幕第一页 | 美女黄视频网站 | 午夜免费看 | 四虎成人免费视频 | 多啪啪免费视频 | 久久久久影视 | 色婷婷激情五月 | 亚洲成人av | 免费观看一级黄色片 | 亚洲性视频在线 | 亚洲精品一区二区三区影院忠贞 | 在线观看视频91 | 五月天六月色 | 毛片日本| 精品人妻一区二区三区免费看 | 91久久人澡人人添人人爽欧美 | 污网站在线观看免费 | 另类男人与善交video | 刘亦菲久久免费一区二区 | 少妇一级淫免费观看 | 日韩久久精品一区二区 | 99热免费在线| 啪啪官网 | 蜜桃麻豆视频 | 又黄又爽又色视频 | 国产精品嫩草影院av蜜臀 | 亚洲av成人片色在线观看高潮 | 善良的公与媳hd中文字 | mm1313亚洲国产精品无码试看 | 97热视频| 欧美精品一区二区在线播放 | 朝桐光av在线 | 亚洲av无码一区东京热久久 | 日批视频免费在线观看 | 欧美熟妇另类久久久久久不卡 |