JVM学习笔记 03 - 字节码
创始人
2025-05-29 05:25:15

字节码

        一句话概括 JVM 与操作系统之间的关系:JVM 上承开发语言,下接操作系统,它的中间接口就是字节码

  • JVM:等同于操作系统;
  • Java 字节码:等同于汇编语言。

        Java 字节码一般都比较容易读懂,这从侧面上证明 Java 语言的抽象程度比较高。你可以把 JVM 认为是一个翻译器,会持续不断的翻译执行 Java 字节码,然后调用真正的操作系统函数,这些操作系统函数是与平台息息相关的。

        使用 JDK 的工具 javac 进行编译后,会产生 HelloWorld 的字节码。
        我们一直在说 Java 字节码是沟通 JVM 与 Java 程序的桥梁,下面使用 javap 来稍微看一下字节码到底长什么样子。

0 getstatic #2 
3 ldc #3 
5 invokevirtual #4 
8 return

        Java 虚拟机采用基于栈的架构,其指令由操作码和操作数组成。这些字节码指令,就叫作 opcode。其中,getstatic、ldc、invokevirtual、return 等,就是 opcode,可以看到是比较容易理解的。
        我们继续使用 hexdump 看一下字节码的二进制内容。与以上字节码对应的二进制,就是下面这几个数字(可以搜索一下)。

b2 00 02 12 03 b6 00 04 b1

注意:这里是二进制文件的16进制表示,也就是hex,一般分析二进制文件都是以hex进行分析。

        我们可以看一下它们的对应关系。

0xb2   getstatic       获取静态字段的值
0x12   ldc             常量池中的常量值入栈
0xb6   invokevirtual   运行时方法绑定调用方法
0xb1   return          void 函数返回

代码例子

public long test(long);descriptor: (J)Jflags: ACC_PUBLICCode:stack=4, locals=5, args_size=20: aload_01: getfield      #2                  // Field a:I4: i2l5: lload_16: ladd7: getstatic     #3                  // Field C:J10: ladd11: lstore_312: lload_313: lreturnLineNumberTable:line 13: 0line 14: 12LocalVariableTable:Start  Length  Slot  Name   Signature0      14     0  this   LB;0      14     1   num   J12       2     3   ret   J

执行过程

        回顾一下 JVM 运行时的相关内容。main 线程会拥有两个主要的运行时区域:Java 虚拟机栈和程序计数器。其中,虚拟机栈中的每一项内容叫作栈帧,栈帧中包含四项内容:局部变量报表、操作数栈、动态链接和完成出口。
我们的字节码指令,就是靠操作这些数据结构运行的。下面我们看一下具体的字节码指令。

        字节码的执行流程可以这样理解:字节码在Java虚拟机栈中被执行,每一项内容都可以看作是一个栈帧,栈帧的结构包括局部变量表、操作数栈、链接、返回地址。这时候就很明了了,栈帧的执行流程就是字节码的执行流程了。类中变量会被解析到局部变量表,然后对操作数栈进行入栈出栈的操作,在此期间有可能引用到动态或静态链接,最后把计算结果的引用地址返回。

查看字节码

命令行查看字节码

        使用下面的命令编译源代码 A.java。如果你用的是 Idea,可以直接将参数追加在 VM options 里面。

javac -g:lines -g:vars A.java

        这将强制生成 LineNumberTable 和 LocalVariableTable。
        然后使用 javap 命令查看 A 和 B 的字节码。

javap -p -v A
javap -p -v B

        这个命令,不仅会输出行号、本地变量表信息、反编译汇编代码,还会输出当前类用到的常量池等信息。

可视化查看字节码

        我们可以使用更加直观的工具 jclasslib,来查看字节码中的具体内容了。

        我们观察到还有 LineNumberTable 等选项,该属性的作用是描述源码行号与字节码行号(字节码偏移量)之间的对应关系。有这些信息,在 debug 时,就能获取到发生异常的源代码行号。 

第04讲:动手实践:从栈帧看字节码是如何在 JVM 中进行流转的

第02讲:大厂面试题:你不得不掌握的 JVM 内存管理

相关内容

热门资讯

第一部分——简单句——第一章—... 谓语动词的物种变化 (二)情态   情态不变动词 can be/must...
网商银行40亿永续债获批!银行... 本文来源:时代周报 作者:黄宇昆时隔5年,浙江网商银行再次获批发债“补血”。近日,浙江金融监管局发布...
甜粽子和咸粽子都没人吃了? 在端午节的传统美食中,甜粽子和咸粽子曾是人们餐桌上的常客。然而,如今却出现了一种令人惊讶的现象,那就...
超4100只个股下跌 超410... 2025.05.30本文字数:424,阅读时长大约1分钟作者 |一财资讯截至午间收盘,沪指跌0.31...
「午盘」A股早盘弱势震荡收跌,... A股三大股指5月30日集体低开。早盘两市探底回升,三大股指跌势明显,个股呈现普跌态势。从盘面上看,可...
English Learnin... English Learning - L2 语音作业打卡 复习对比 [ɔ:] [ɒ] Day22 2...
Java设计模式 02-工厂模... 工厂模式 一、简单(静态)工厂模式 1、看一个具体的需求 看一个披萨的项目:要便于披萨...
嘉应制药信披违规突遭立案,养天... 5月28日晚,广东嘉应制药股份有限公司(以下简称“嘉应制药”)发布公告,公司收到中国证券监督管理委员...
河北保定蠡县县委书记陈伟已跨市... 澎湃新闻记者从相关方面独家获悉,原任河北保定蠡县县委书记的陈伟近日已跨市调任廊坊三河市委书记。 陈...
4月,全国发行新增债券2534... 2025年4月地方政府债券发行和债务余额情况 一、全国地方政府债券发行情况 (一)当月发行情况。 2...
JFX-A型精子质量分析仪空气... JFX-A型精子质量分析仪空气减震器:为精准医疗保驾护航行 在现代医疗技术中,精子质量分析仪是评估男...
“王健林卖万达广场”话题连续4... "先定个小目标"的王健林,如今却像清仓特卖般疯狂甩卖手里近1/5的万达广场,背后暗藏什么玄机? 短...
AI概念股早盘走弱,人工智能相... AI概念股早盘走弱,中科星图跌超8%,芯原股份、寒武纪-U、光环新网跌超3%。 受盘面影响,人工智能...
原创 稀... 近期,据美国《纽约时报》援引匿名知情人士的话报道称,美国商务部已暂停部分允许美国公司向中国商用飞机有...
一线城市豪宅市场火爆:500亿... “日光盘”接连上演,上海楼市持续高温。 5月27日,上海共有7个楼盘集中入市,其中3个项目实现“日光...
信泰人寿合规之殇:国资入局能否... 信泰人寿从民企转为国企,过程布满荆棘。自2007年成立以来,经历了股东内斗、偿付能力危机、高管贪腐、...
傲农生物“脱险”后,何时恢复盈... 得益于2024年财报的向好表现,福建傲农生物科技集团股份有限公司(简称“傲农生物”)近日被撤销退市风...
Java:分布式RPC框架Ap... 目录一、软件架构的演进过程【了解】二、Dubbo概述【了解】1、Dubbo简介2、Dubb架构三、服...
长肥网络与TCP的长肥管道 本文目录1、简化的理解网络模型2、时延带宽积的定义3、长肥网络与TCP长肥管道的定义4、TCP长肥管...
从NLP视角看电视剧《狂飙》,... 文章目录1、背景2、数据获取3、文本分析与可视化3.1 短评数据预处理3.2 词云图可视化3.3 t...
下一个万亿级蓝海市场,数字能源... 随着全球碳中和共识的形成、能源转型的推进,数字能源作为新一代能源技术的重要组成部分,成为各国政府和企...
【CSS】P9 选择器优先级 选择器优先级抛出一个问题选择器优先级权重!important外部样式与内部样式冲突 抛出一个问题 ...
孙悟空为何成了完美男友? 孙悟空成为完美男友,实乃其独特特质所致。他神通广大,能在女友遇到危险时瞬间现身,如那盖世英雄,给予最...
深市同标的规模最大的证券ETF... 5月30日,A股早盘震荡走低,券商板块回调。相关ETF中,证券ETF(159841)截至发稿跌0.7...
中建投信托地产风险化解仍需时日... 中建投信托仍然被“地产旧伤"拖累。文/每日财报 汇水在信托行业深度转型的2024年,年报数据清晰反...
RTP载荷H265(实战细节) H264与H265协议详解RTP载荷H264(实战细节) RTP载荷H2...
【2023.3.8】数据结构复... 【2023.3.8】数据结构复习笔记 文章目录【2023.3.8】数据结构复习笔记序言一、绪论二、线...
赛力斯应邀出席东盟重要经济论坛... 近年来,伴随着中国汽车产业的全面国际化,中国车企的全球影响力日益提升,就在最近赛力斯被应邀出席东盟-...
聚集更有国际化潜力研发管线 君... 5月29日,上海君实生物医药科技股份有限公司(简称“君实生物”)发布关于部分募投项目子项目变更及金额...
面经-2023-哲库Zeku-... 专栏推荐:2023 数字IC设计秋招复盘——数十家公司笔试题、面试实录 专栏首页:2023 数字IC...