云时代的 JVM 原理与实战
康杨
京东资深架构师
3111 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 39 讲
云时代的 JVM 原理与实战
15
15
1.0x
00:00/00:00
登录|注册

05|机器与语言:JVM 中的字节码

你好,我是康杨。今天我们来聊聊 JVM 的语言——字节码。
在前面的介绍中,我们提到过 Java 语言的平台无关性,这也是 Java 能够快速崛起的原因之一。我们只需要用 Java 语言完成业务逻辑的开发,JVM 就会帮助我们完成在物理服务器上的运行,而不用去关心底层硬件平台的差异性,能够达成这种效果的关键角色就是字节码。
借助字节码,JVM 屏蔽了上层编程语言(Java、Scala )和下层硬件平台的多样性。而 JVM 被认为是字节码的运行时。

字节码是什么?

Java 源代码经过编译器编译后,就会生成 JVM 字节码,它是 Java 程序在 JVM 上执行的中间表示形式。JVM 字节码是一种基于栈的指令集架构(Stack-based Instruction Set Architecture)。每个字节码指令都会在 JVM 上执行一系列的操作,如加载、存储、运算、跳转等。
它使用基于操作数栈和局部变量表的执行模型。具有以下特点:
独立于具体的硬件和操作系统,不同平台上的 JVM 可以解释和执行相同的字节码文件。
相对于机器码和源代码,JVM 字节码是一种更高级别的抽象,并且比机器码更容易阅读和编写(理解)。
JVM 字节码通过运行时的即时编译器或解释器执行。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

JVM字节码是Java程序在JVM上执行的中间表示形式,具有跨平台的能力。字节码通过运行时的即时编译器或解释器执行,使得Java程序具备了很高的可移植性和兼容性。本文深入介绍了字节码的特点、获取和查看字节码文件的方法,以及字节码指令集的内容。此外,还解析了JVM如何执行字节码的过程,包括乘法和除法运算的字节码执行过程。文章强调了在编写字节码时需要注意的最佳实践和优化点,以及在现实环境中的应用实例。通过对字节码的深入了解,读者可以更好地理解JVM的执行过程,从而进行性能优化和问题排查。文章还提到了如何利用字节码进行程序优化,包括减少栈操作、合理使用加载和存储指令、避免重复计算等技巧。了解并恰当应用字节码技术可以优化性能,提升代码的简洁性,对于实际项目具有重要意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云时代的 JVM 原理与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(6)

  • 最新
  • 精选
  • 浩仔是程序员
    那个例子有点看不懂

    作者回复: 比如那些部分没有看明白呢

    2023-08-30归属地:广东
    2
    6
  • 临风
    老师,有个地方不太理解,为什么通过动态代理生成的List就比原来的性能更好,代理get方法后,不是也要执行判空逻辑吗? 对于字节码的应用,我想到的一个是性能监控,大概了解了一下,像skywalking就是通过注入字节码,将trace ID保存到threadLocal中去,并在调用其他接口时设置到header中去,由此完成了链路跟踪的功能。

    作者回复: 动态代理生成的List比原来的性能更好,其主要原因在于动态代理可以在运行时生成代理对象,并动态地决定何时、如何和哪些方法去执行,避免了不必要的逻辑判断。 比如我们在代理get方法时,本来需要检测参数是否为null,代理后我们可以预先设定null无效化,并在代理代码中直接跳过这个逻辑,避免进行null判断,这样就可以提升执行效率。 至于字节码应用的例子,你的理解完全正确。像SkyWalking这样的性能监控工具就是通过字节码注入技术,将追踪代码注入到目标方法中,从而获取方法的调用链路、调用时长等信息。具体到SkyWalking,其实使用此种技术主要是为了完成对分布式链路追踪的功能。

    2023-08-30归属地:广东
    3
    1
  • Geek_f46b9e
    为什么 采用乘以反数的方式替代除法计算可以提高运算效率呢

    作者回复: 这是因为在硬件或底层软件中实现除法运算,需要进行更复杂的算法和数学计算。因此,如果有可能,程序员倾向于使用其他方式(如乘法或位运算)来避免除法运算,以提高程序的运行效率

    2023-09-09归属地:广东
  • 非洲黑猴子
    最后这个例子不太明白, OptimizedStringProcessor怎么就快了? 谢谢
    2023-09-12归属地:美国
    2
  • peter
    请教老师几个问题: Q1:“利用动态代理生成类的字节码”,这句话不太理解:文中是Java代码啊,什么时候生成字节码?类编译后就是字节码,还需要二次生成字节码? Q2:#后面跟一个数字,比如#2表示什么意思? Q3:在进行底层运算之前,JVM进行了自己的字节码运算,是吗? 如果是这样,相当于有两次运算,首先在JVM中进行了字节码级别的运算,然后交给系统CPU进行第二次运算,是吗?(我原来一直认为是把字节码翻译为机器码,然后运行)
    2023-08-30归属地:北京
    1
  • JavaBit
    OptimizedStringProcessor这个例子出错了吧,我测试了下没有调用get方法,使用的是iterator的方法,字符串并没有变成大写。 另外,这个例子哪里可以体现性能的优化呢,有没有大批量的数据验证呢
    2024-03-06归属地:上海
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部