日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
居然還有方式可以查看Java方法的匯編代碼,真是神奇

當我們在研究java的內(nèi)部實現(xiàn)時,經(jīng)常會需要查看java方法的字節(jié)碼,有時為了確定一些問題,甚至還需要查看某些方法在jit編譯后的匯編代碼。

成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比依蘭網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式依蘭網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋依蘭地區(qū)。費用合理售后完善,十多年實體公司更值得信賴。

這篇文章我們從零開始,詳細說一下如何查看java方法的字節(jié)碼以及匯編代碼,希望能給有這方面困惑的同學(xué)提供一些幫助。

為了真正意義上的從零開始,我們自己動手,通過源碼構(gòu)建一個屬于我們自己的jdk,該過程雖然不是必須的,但了解這些過程,對于我們理解后文,以及后續(xù)的jvm研究,都是有一定的幫助的。

首先,下載jdk源碼:

 
 
 
 
  1. $ git clone https://github.com/openjdk/jdk.git 

源碼下載完畢后,我們看下jdk內(nèi)部大致的目錄結(jié)構(gòu):

該目錄中的 doc/building.html 詳細說明了如何構(gòu)建一個jdk,有興趣的同學(xué)可以好好看下。

在jdk目錄里,我們執(zhí)行以下命令,要求構(gòu)建一個debug版本的jdk,并指定其安裝路徑為jdk-build:

 
 
 
 
  1. $ bash configure --with-debug-level=slowdebug --with-native-debug-symbols=internal --prefix=$HOME/jdk-build 

如果該命令執(zhí)行過程中沒有問題,則會有類似于下圖的輸出:

configure命令執(zhí)行成功后,我們再執(zhí)行下面的命令,開始真正構(gòu)建jdk,并將構(gòu)建成功后的jdk安裝到j(luò)dk-build目錄里:

 
 
 
 
  1. $ make images 
  2. $ make install 

以上兩個命令成功后,我們可以切換到j(luò)dk-build目錄,看下新構(gòu)建的jdk:

好了,我們已經(jīng)有了自己的jdk了,下面我們可以用它來查看java方法的字節(jié)碼及匯編代碼。

首先,準備下列文件:

我們先來看下如何查看字節(jié)碼,這個大家應(yīng)該都知道,但我這里還是演示下:

上圖是通過jdk自帶的javap命令來查看java的字節(jié)碼,其實還有很多其他的方式,比如各種ide中集成的工具,這里我們就不一一演示了。

javap還有很多參數(shù),比如 -p -v 等都非常有用,有興趣的可以自己試下。

字節(jié)碼就說這些,下面我們主要來看下如何查看java方法的匯編代碼。

想要查看java方法在jit編譯后的匯編代碼,我們不僅要在執(zhí)行java命令時指定一些參數(shù),還需要一個額外的小工具,來輔助我們解匯編代碼。

如果沒有這個工具,jvm輸出的是機器碼,是不可讀的,有了這個工具,它可以幫我們自動將機器碼轉(zhuǎn)成匯編代碼,非常方便。

這個工具就是hsdis,它的源碼就在jdk里,但構(gòu)建jdk的過程并不會構(gòu)建這個工具,如果我們想要使用它,要單獨構(gòu)建。

由上圖可見,該工具還是非常簡單的,它主要是通過調(diào)用gnu的binutils來解jvm輸出的匯編代碼,該工具的詳細構(gòu)建過程可以參考README和Makefile。

因為該工具依賴gnu binutils解碼,所以我們要先下載binutils:

下載完binutils后,我們執(zhí)行以下命令,開始構(gòu)建hsdis:

 
 
 
 
  1. $ make BINUTILS=binutils-2.35.1 all64 

如果沒有問題的話,最終會在build/linux-amd64目錄下生成一個hsdis-amd64.so文件:

將該文件拷貝到我們之前構(gòu)建好的jdk里:

好,準備工作已經(jīng)完成,現(xiàn)在我們可以通過指定一些參數(shù),來查看java方法的匯編代碼了。

我們還是用上面那個java類T.java,假設(shè)我們想查看方法f1在jit編譯后的匯編代碼,可以使用下面的命令:

該命令會輸出很多內(nèi)容,而下圖中的就是我們想要的:

看到?jīng)],真的是匯編,且選中行就是方法f1的相加邏輯。

我們可以通過不同的參數(shù)來指定要查看的某個方法或某些方法,我們也可以通過-XX:+PrintAssembly參數(shù),來查看所有被jit編譯的方法。

有關(guān)各參數(shù)的使用及意義,請參考以下鏈接:

https://docs.oracle.com/en/java/javase/15/docs/specs/man/java.html

查看java方法的匯編代碼,對于我們理解java的內(nèi)部實現(xiàn),是非常有意義的,通過這種方式的輔助,我們可以理解很多文檔上難以理解的內(nèi)容,比如 volatile。

本文轉(zhuǎn)載自微信公眾號「卯時卯刻」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系卯時卯刻公眾號。


當前文章:居然還有方式可以查看Java方法的匯編代碼,真是神奇
鏈接分享:http://www.5511xx.com/article/dhosocj.html