【實戰JVM】-基礎篇-01-JVM通識-字節碼詳解

【實戰JVM】-基礎篇-01-JVM通識-字節碼詳解-類的聲明周期-加載器

  • 1 初識JVM
    • 1.1 什么是JVM
    • 1.2 JVM的功能
      • 1.2.1 即時編譯
    • 1.3 常見JVM
  • 2 字節碼文件詳解
    • 2.1 Java虛擬機的組成
    • 2.2 字節碼文件的組成
      • 2.2.1 正確打開字節碼文件
      • 2.2.2 字節碼組成
      • 2.2.3 基礎信息
        • 2.2.3.1 魔數
        • 2.2.3.1 主副版本號
      • 2.2.4 常量池
      • 2.2.5 方法
    • 2.3 linux中打開字節碼文件
    • 2.4 字節碼常用工具 Arthas
      • 2.4.1 安裝Arthas
      • 2.4.2 Arthas功能
        • 2.4.2.1 獲取系統實時面板-dashboard
        • 2.4.2.2 加載特定類的字節碼-dump
        • 2.4.2.3 反編譯已加載類的源碼-jad
        • 2.4.2.4 查看JVM已加載的類信息-sc


1 初識JVM

1.1 什么是JVM

在這里插入圖片描述
在這里插入圖片描述

1.2 JVM的功能

在這里插入圖片描述

1.2.1 即時編譯

即時編譯Just-In-Time 簡稱JIT進行性能的優化,最終到達接近C、C++的性能

在這里插入圖片描述
在這里插入圖片描述

將熱點代碼轉換為機器碼后保存至RAM,下次執行時直接從RAM中調用。

在這里插入圖片描述

1.3 常見JVM

在這里插入圖片描述

java -version

在這里插入圖片描述

2 字節碼文件詳解

2.1 Java虛擬機的組成

在這里插入圖片描述

2.2 字節碼文件的組成

2.2.1 正確打開字節碼文件

安裝jclasslib

在這里插入圖片描述
打開任意一個class文件
在這里插入圖片描述

2.2.2 字節碼組成

  • 基礎信息(一般信息+接口):

    • 魔數、字節碼對應的java版本號,訪問標識(public、final等),以及這個類父類是哪個,以及實現了哪些接口
  • 常量池:

    • 保存了字符串常量、類、接口名、字段名。主要在字節碼指令中使用。
    • 在這里插入圖片描述
  • 字段:

    • 當前類或接口的字段信息,包括名字,描述符,訪問標識。

    • private final static int a1=0
      
    • 在這里插入圖片描述

  • 方法:

    • 當前類或接口的聲明的方法信息字節碼指令
    • 在這里插入圖片描述
  • 屬性:

    • 類的屬性,比如源碼的名字、內部類的列表等
    • 在這里插入圖片描述

2.2.3 基礎信息

在這里插入圖片描述

在這里插入圖片描述

2.2.3.1 魔數

在這里插入圖片描述

在這里插入圖片描述

打開二進制的png文件,就是以89504E47開始的

在這里插入圖片描述

jpg則以FFD8FF開始

在這里插入圖片描述

java字節碼則是以CAFEBABE開始

在這里插入圖片描述

2.2.3.1 主副版本號

在這里插入圖片描述

52對應jdk1.8 61則對應jdk17

2.2.4 常量池

public class HelloWorld{public static final String a1= "a1a1a1";public static final String a2= "a1a1a1";public static void main(String[] args){System.out.println("Hello world!");}
}

查看編譯后的class文件

在這里插入圖片描述

兩個都是常量,且指向同一塊常量值索引,CONSTANT_String_info存放著cp_info #33,依舊是個索引

在這里插入圖片描述

查看cp_info #33,這時候字面量才是a1a1a1

在這里插入圖片描述

為什么要兩級索引呢?這是因為在jvm中的運行時數據區域中有這方法區,方法區主要用來存儲已被虛擬機加載的類的信息、常量、靜態變量和即時編譯器編譯后的代碼等數據。方法區里有一個運行時常量池,用于存放靜態編譯產生的字面量和符號引用。該常量池具有動態性,也就是說常量并不一定是編譯時確定,運行時生成的常量也會存在這個常量池中。

在這里插入圖片描述

public class HelloWorld{public static final String a1= "abc";public static final String a2= "abc";public static final String abc= "abc";public static void main(String[] args){System.out.println("Hello world!");}
}

比如字段名和常量名都叫abc,但常量名是abc是String類型,而字段名是無類型的,但是都指向utf8格式的abc

在這里插入圖片描述

2.2.5 方法

public static void main(String[] args){int i=0;i=i++;System.out.println(i);
}

對應字節碼:

 0 iconst_0   			//操作數棧: [] -> [0],將常量值0壓入操作數棧。1 istore_1   			//操作數棧: [0] -> [],將操作數棧頂的整數值(0)存入本地變量1。2 iload_1    			//操作數棧: [] -> [0],將本地變量1中的整數值(0)加載到操作數棧。3 iinc 1 by 1 			//本地變量1的值增加1。原值是0,現在變為1。6 istore_1				//操作數棧: [0] -> [],將操作數棧頂的整數值存入本地變量1。本地變量: [1]-> [0],7 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>  //獲取System.out的值并壓入操作數棧。
10 iload_1				//操作數棧: [Ljava/io/PrintStream;] -> [Ljava/io/PrintStream;, 0],將本地變量1中的整數值加載到操作數棧。
11 invokevirtual #3 <java/io/PrintStream.println : (I)V>
14 return

i處于局部變量表的1號位

在這里插入圖片描述

如果換成++i

public static void main(String[] args){int i=0;i=++i;System.out.println(i);
}
 0 iconst_01 istore_1				//0放到本地變量表2 iinc 1 by 1			//本地變量表先自增,0->15 iload_1				//將本地變量1中的整數值(1)加載到操作數棧。6 istore_1				//操作數棧: [1] -> [],將操作數棧頂的整數值存入本地變量1。本地變量: [1]-> [1],7 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
10 iload_1
11 invokevirtual #3 <java/io/PrintStream.println : (I)V>
14 return

這樣就不會發生i=i++這種覆蓋賦值的情況了。

作業:

int i=0,j=0,k=0;
i++;
j=j+1;
k+=1;

i和k一樣快,都是把0從操作數棧中放入本地變量中直接操作本地變量自增。

j最慢,從本地變量表中加載到操作數棧中,再加載1,再相加,再放入本地變量表。

2.3 linux中打開字節碼文件

在這里插入圖片描述

javap -v 字節碼文件名稱

2.4 字節碼常用工具 Arthas

2.4.1 安裝Arthas

在這里插入圖片描述

啟動arthas

在這里插入圖片描述

先啟動項目再分析

public class ArthasDemo {public static void main(String[] args) {while (true) {try {Thread.sleep(2000L);} catch (InterruptedException e) {e.printStackTrace();}}}
}

在arthas工作目錄中啟動

java -Dfile.encoding=UTF-8 -jar arthas-boot.jar

-Dfile.encoding=UTF-8是讓arthas以utf8格式啟動,這樣不會亂碼
在這里插入圖片描述

成功捕獲到ArthasDemo,選擇3回車進入arthas內部,他還自動下載了arthas3.7.2版本

3

在這里插入圖片描述

2.4.2 Arthas功能

在這里插入圖片描述

2.4.2.1 獲取系統實時面板-dashboard

在這里插入圖片描述

我們設置每隔兩秒刷新一次,刷新3次

dashboard -i 2000 -n 3

在這里插入圖片描述

只顯示1次

在這里插入圖片描述

2.4.2.2 加載特定類的字節碼-dump

在這里插入圖片描述

dump -d D:/File/StudyJavaFile/JavaStudy/JVM/low/day01/resource/ com.sjb.arthas.ArthasDemo

在這里插入圖片描述

在這里插入圖片描述

這樣就獲取了運行時的java文件的字節碼信息

2.4.2.3 反編譯已加載類的源碼-jad
jad com.sjb.arthas.ArthasDemo

在這里插入圖片描述

和我們的源碼幾乎一致

案例

在這里插入圖片描述

啟動springboot-classfile后

在這里插入圖片描述

public UserVO user(@PathVariable("type") Integer type,@PathVariable("id") Integer id){//前邊有一大堆邏輯,巴拉巴拉if(type==UserType.REGULAR.getType()){return new UserVO(id,"普通用戶無權限查看");}return new UserVO(id,"這是尊貴的收費用戶才能看的秘密!");
}

不能用==來判斷類型,需要equals

在這里插入圖片描述

在這里插入圖片描述

即使是普通用戶,但是因為用的==判斷的類型,也能進入vip用戶

使用jad查看

jad com.itheima.springbootclassfile.controller.UserController

在這里插入圖片描述

定位到問題信息,以供以后熱更新

2.4.2.4 查看JVM已加載的類信息-sc

在這里插入圖片描述

sc -d 類名(java.lang.String)

查看當前類的類加載器,如果為空,則為啟動類加載器。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/16446.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16446.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/16446.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C++】右值引用 移動語義

目錄 前言一、右值引用與移動語義1.1 左值引用和右值引用1.2 右值引用使用場景和意義1.3 右值引用引用左值及其一些更深入的使用場景分析1.3.1 完美轉發 二、新的類功能三、可變參數模板 前言 本篇文章我們繼續來聊聊C11新增的一些語法——右值引用&#xff0c;我們在之前就已…

進程間通信的方式中,socket和消息隊列的區別

進程間通信的方式中&#xff0c;socket和消息隊列的區別 進程間通信方式中&#xff0c;socket和消息隊列的主要區別在于通信的方式和跨機通信的能力。 socket是通過網絡傳輸的方式來實現進程間通信&#xff0c;并且可以跨主機&#xff1b;而消息隊列是通過內核提供的緩沖區進…

Flutter 中的 AbsorbPointer 小部件:全面指南

Flutter 中的 AbsorbPointer 小部件&#xff1a;全面指南 在Flutter中&#xff0c;AbsorbPointer是一個特殊的小部件&#xff0c;用于吸收&#xff08;或“吞噬”&#xff09;所有傳遞到其子組件的指針事件&#xff08;如觸摸或鼠標點擊&#xff09;。這在某些情況下非常有用&…

民國漫畫雜志《時代漫畫》第22期.PDF

時代漫畫22.PDF: https://url03.ctfile.com/f/1779803-1248634856-2c7010?p9586 (訪問密碼: 9586) 《時代漫畫》的雜志在1934年誕生了&#xff0c;截止1937年6月戰爭來臨被迫停刊共發行了39期。 ps: 資源來源網絡!

Typescript高級: 深入理解Extract類型

概述 在TypeScript這一逐漸成為前端開發首選的靜態類型檢查語言中&#xff0c;類型系統提供了豐富的工具來幫助開發者編寫更加健壯和可維護的代碼。其中&#xff0c;Extract<T, U>是一個強大的內置實用類型&#xff0c;用于從一個聯合類型T中提取出屬于另一個類型U的那些…

AIGC 006-textual-inversion使用文本反轉實現個性化文本到圖像生成!

AIGC 006-textual-inversion使用文本反轉實現個性化文本到圖像生成&#xff01; 文章目錄 0 論文工作1 論文方法2 效果 0 論文工作 這篇論文 (An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual Inversion) 提出了一種新穎的技術&#xff0c…

Modal.method() 不顯示頭部的問題

ant-design中的Modal組件有兩種用法&#xff1a; 第一種是用標簽&#xff1a;<a-modal></a-modal> 第二種是用Api&#xff1a;Modal.info、Modal.warning、Modal.confirm...... 一開始項目中這兩種用法是混用的&#xff0c;后面UI改造&#xff0c;需要統一樣式&…

一個程序員的牢獄生涯(37)任務

星期一 任 務 我走回大鐐面前后,把雙手抱著的衣服遞給大鐐,但我并沒有把手里的東西也遞給他。現在的大鐐坐著,我站著,這個時候要給大鐐的話,肯定能被身邊的棍子或六子看到,甚至被所有號子里的人都看到。因為此時,所有人的目光都盯著我手里的衣服,盯著我和大鐐看。 “鐐…

Shell字符串變量

目標 能夠使用字符串的3種方式 掌握Shell字符串拼接 掌握shell字符串截取的常用格式 能夠定義Shell索引數組和關聯數組 能夠使用內置命令alias,echo,read,exit,declare操作 掌握Shell的運算符操作 Shell字符串變量 介紹 字符串&#xff08;String&#xff09;就是一系…

使用LabVIEW時遇到VISA屬性錯誤 -1073807331的解決方案

在LabVIEW或VeriStand中使用VISA屬性時&#xff0c;可能會遇到錯誤 -1073807331。這一錯誤的具體描述如下&#xff1a; 解決方案 導致VISA屬性出現此錯誤的原因主要有以下四種&#xff1a; 屬性不被使用的串行總線支持 示例 A.1&#xff1a;Is Port Connected VISA屬性僅支持由…

React(四)memo、useCallback、useMemo Hook

目錄 (一)memo API 1.先想一個情景 2.用法 (1)props傳入普通數據類型的情況 (2)props傳入對象的情況 (3)props傳入函數的情況 (4)使用自定義比較函數 3.什么時候使用memo&#xff1f; (二)useMemo Hook 1.用法 2.useMemo實現組件記憶化 3.useMemo實現函數記憶化 …

如何停止 iPad 和 iPhone 之間共享短信,獨立接收和發送消息

概括 在當今高度互聯的數字世界中&#xff0c;Apple 設備之間的無縫連接性提供了極大的便利&#xff0c;尤其是在消息同步方面。iPhone 和 iPad 用戶通常可以享受到設備間短信的自動同步功能&#xff0c;這意味著無論是在哪個設備上&#xff0c;用戶都可以接收和回復消息。然而…

2024.5.26.python.exercise

# # 導入包 # from pyecharts.charts import Bar, Timeline # from pyecharts.options import LabelOpts, TitleOpts # from pyecharts.globals import ThemeType # # # 從文件中讀取信息 # GDP_file open("1960-2019全球GDP數據.csv", "r", encoding&quo…

A. Maximize?

time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You are given an integer x&#x1d465;. Your task is to find any integer y&#x1d466; (1≤y<x)(1≤&#x1d466;<&#x1d465;) su…

深入理解python列表與字典:數據結構的選擇與性能差異

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、列表與字典&#xff1a;基礎數據結構的對比 二、列表&#xff1a;逐個遍歷的查找方式 …

Ceres求解優化問題

1. 簡介 Ceres Solver是專門用于求解非線性最小二乘問題的C開源庫,研究SLAM方向不過濾波和優化兩個技術路線,因此常用Ceres庫解決實際項目中的優化問題,當然還有g2o同樣可用,但就說明文檔而言,Ceres對新用戶更友好,g2o提供不多的文檔,更多是需要參考其它開源項目使用,所以筆者…

【JAVA】接口

前面我們說了說抽象類相關內容&#xff0c;這篇我們主要聊聊接口相關內容&#xff0c;這部分很重要&#xff0c;大家引起關注。 1. 接口 1.1 接口的概念 接口就是公共的行為規范標準&#xff0c;大家在實現時&#xff0c;只要符合規范標準&#xff0c;就可以通用。在Java中&am…

力扣 739. 每日溫度 python AC

單調棧 class Solution:def dailyTemperatures(self, temperatures):size len(temperatures)ll []ans [0] * sizefor i in range(size - 1, -1, -1):while ll and temperatures[i] > temperatures[ll[-1]]:ll.pop()if ll:ans[i] ll[-1] - ill.append(i)return ans

C語言 數組——向函數傳遞數組

目錄 把數組傳給函數&#xff08;Passing Arrays to Functions&#xff09; 向函數傳遞一維數組 向函數傳遞二維數組 數組在學生成績管理中的應用 例&#xff1a;計算每個學生的平均分 把數組傳給函數&#xff08;Passing Arrays to Functions&#xff09; 向函數傳遞一維…

gnocchi學習小結

背景 總結gnocchi 4.4版本gnocchi-metricd工作流程 入口 gnocchi.cli.metricd metricd stop after processing metric默認為0&#xff0c;調servicemanager run MetricdServiceManager __init__ 服務邏輯封裝到MetricdServiceManager初始化中 主要由MetricProcessor, Met…