成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

居然還有方式可以查看Java方法的匯編代碼,真是神奇

開發 后端
當我們在研究java的內部實現時,經常會需要查看java方法的字節碼,有時為了確定一些問題,甚至還需要查看某些方法在jit編譯后的匯編代碼。

 [[350157]]

當我們在研究java的內部實現時,經常會需要查看java方法的字節碼,有時為了確定一些問題,甚至還需要查看某些方法在jit編譯后的匯編代碼。

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

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

首先,下載jdk源碼:

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

源碼下載完畢后,我們看下jdk內部大致的目錄結構:

 

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

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

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

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

 

configure命令執行成功后,我們再執行下面的命令,開始真正構建jdk,并將構建成功后的jdk安裝到jdk-build目錄里:

  1. $ make images 
  2. $ make install 

以上兩個命令成功后,我們可以切換到jdk-build目錄,看下新構建的jdk:

 

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

首先,準備下列文件:

 

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

 

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

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

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

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

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

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

 

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

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

 

下載完binutils后,我們執行以下命令,開始構建hsdis:

  1. $ make BINUTILS=binutils-2.35.1 all64 

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

 

將該文件拷貝到我們之前構建好的jdk里:

 

好,準備工作已經完成,現在我們可以通過指定一些參數,來查看java方法的匯編代碼了。

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

 

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

 

看到沒,真的是匯編,且選中行就是方法f1的相加邏輯。

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

有關各參數的使用及意義,請參考以下鏈接:

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

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

本文轉載自微信公眾號「卯時卯刻」,可以通過以下二維碼關注。轉載本文請聯系卯時卯刻公眾號。

 

責任編輯:武曉燕 來源: 卯時卯刻
相關推薦

2021-08-10 10:48:39

拷貝代碼架構耦合

2021-02-04 08:01:35

RedisRDBAOF

2020-08-20 08:39:54

CTO代碼數據

2024-04-24 11:27:16

字典推導式Python

2021-01-01 14:36:03

Python開發語言

2012-03-19 15:44:39

代碼

2021-08-10 10:25:16

HTML 網絡開發前端開

2017-04-05 11:10:23

Javascript代碼前端

2015-04-14 09:46:09

Apple Watch秘密

2022-04-08 08:01:07

IPv4地址IPv6

2024-01-03 08:12:10

計算求和Python內置函數

2021-11-02 16:25:41

Python代碼技巧

2021-12-29 07:44:51

Proto代碼微服務

2025-04-08 08:12:26

Next.js組件ChatGPT

2021-04-15 15:20:46

PythonProperty裝飾器

2020-11-01 17:11:51

time.sleep暫停代碼Python

2021-11-16 12:25:14

jsPPT前端

2016-10-11 17:21:30

IT

2021-09-29 08:23:56

項目css

2022-12-02 08:48:16

CSS置灰網站
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产91黄色 | 亚洲视频一区在线 | 亚洲福利在线视频 | 少妇一级淫片免费播放 | 欧美日韩一区在线 | 成人免费视频久久 | 天堂在线91| 国产日韩欧美另类 | 久久精品一区二区 | 国产激情片在线观看 | 亚洲精品视频免费观看 | 一级毛片在线看 | 免费av观看| 亚洲高清av在线 | 欧美美乳 | 日韩国产专区 | 日本在线视频一区二区 | 成人国产综合 | 午夜欧美| 久久久精品视频免费 | 天堂久| 国产精品极品美女在线观看免费 | 国产一区二区三区在线观看免费 | 女女爱爱视频 | 国产视频福利一区 | 九九热re| 国产乱码一二三区精品 | 国产免费观看一级国产 | 免费一区 | 一级网站 | 亚洲一二三区av | 欧美日韩国产中文字幕 | 成人片免费看 | 欧美激情国产精品 | 国产一区视频在线 | 天天躁日日躁性色aⅴ电影 免费在线观看成年人视频 国产欧美精品 | 日本在线视频一区二区 | 三级免费| 一区二区三区四区在线免费观看 | www.亚洲精品 | 国产无套一区二区三区久久 |