深入拆解Java虚拟机
郑雨迪
Oracle 高级研究员,计算机博士
立即订阅
28017 人已学习
课程目录
已完结 39 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 为什么我们要学习Java虚拟机?
免费
模块一:Java虚拟机基本原理 (12讲)
01 | Java代码是怎么运行的?
02 | Java的基本类型
03 | Java虚拟机是如何加载Java类的?
04 | JVM是如何执行方法调用的?(上)
05 | JVM是如何执行方法调用的?(下)
06 | JVM是如何处理异常的?
07 | JVM是如何实现反射的?
08 | JVM是怎么实现invokedynamic的?(上)
09 | JVM是怎么实现invokedynamic的?(下)
10 | Java对象的内存布局
11 | 垃圾回收(上)
12 | 垃圾回收(下)
模块二:高效编译 (12讲)
【工具篇】 常用工具介绍
13 | Java内存模型
14 | Java虚拟机是怎么实现synchronized的?
15 | Java语法糖与Java编译器
16 | 即时编译(上)
17 | 即时编译(下)
18 | 即时编译器的中间表达形式
19 | Java字节码(基础篇)
20 | 方法内联(上)
21 | 方法内联(下)
22 | HotSpot虚拟机的intrinsic
23 | 逃逸分析
模块三:代码优化 (10讲)
24 | 字段访问相关优化
25 | 循环优化
26 | 向量化
27 | 注解处理器
28 | 基准测试框架JMH(上)
29 | 基准测试框架JMH(下)
30 | Java虚拟机的监控及诊断工具(命令行篇)
31 | Java虚拟机的监控及诊断工具(GUI篇)
32 | JNI的运行机制
33 | Java Agent与字节码注入
模块四:黑科技 (3讲)
34 | Graal:用Java编译Java
35 | Truffle:语言实现框架
36 | SubstrateVM:AOT编译框架
尾声 (1讲)
尾声 | 道阻且长,努力加餐
深入拆解Java虚拟机
登录|注册

22 | HotSpot虚拟机的intrinsic

郑雨迪 2018-09-10
前不久,有同学问我,String.indexOf方法和自己实现的indexOf方法在字节码层面上差不多,为什么执行效率却有天壤之别呢?今天我们就来看一看。
public int indexOf(String str) {
if (coder() == str.coder()) {
return isLatin1() ? StringLatin1.indexOf(value, str.value)
: StringUTF16.indexOf(value, str.value);
}
if (coder() == LATIN1) { // str.coder == UTF16
return -1;
}
return StringUTF16.indexOfLatin1(value, str.value);
}
为了解答这个问题,我们来读一下String.indexOf方法的源代码(上面的代码截取自 Java 10.0.2)。
在 Java 9 之前,字符串是用 char 数组来存储的,主要为了支持非英文字符。然而,大多数 Java 程序中的字符串都是由 Latin1 字符组成的。也就是说每个字符仅需占据一个字节,而使用 char 数组的存储方式将极大地浪费内存空间。
Java 9 引入了 Compact Strings[1] 的概念,当字符串仅包含 Latin1 字符时,使用一个字节代表一个字符的编码格式,使得内存使用效率大大提高。
假设我们调用String.indexOf方法的调用者以及参数均为只包含 Latin1 字符的字符串,那么该方法的关键在于对StringLatin1.indexOf方法的调用。
下面我列举了StringLatin1.indexOf方法的源代码。你会发现,它并没有使用特别高明的算法,唯一值得注意的便是方法声明前的@HotSpotIntrinsicCandidate注解。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入拆解Java虚拟机》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(14)

  • ^_^
    我个人觉得老师讲的非常好,这些东西更像是讲解一个系统似的,让我们更懂他们的运行机制,推算出我们系统每个类、方法和属性在jvm上的运作模式。这课程真的对于我们java开发的真的是太有帮助了,不想某某些课程占着实践经验的名义混。感谢老师辛苦啦!

    作者回复: 多谢支持!

    2018-09-10
    8
  • godtrue
    嗯,JVM的重要性自不必言,学好是进阶的台阶,否则就是屏障。不知道运行原理和机制,怎么理解OOM?怎么优化性能?怎么分析和定位一些奇怪的问题?

    老师讲的相当好了,只是知识储备不够的话,学习曲线是比较陡峭的,比如IR图,那个是第一次听,来龙去脉都不清楚自然会懵逼。还好大部分都能听明白和吸收,只是以后面试能判断出面试官的水平。

    懂JVM我感觉就好像了解地球是圆的以及围绕太阳公转一样,好像平时生活上也没什么用,不过如果想要征服星辰大海,以及迷失方向时还是挺有用的。

    嗯,总之,老师讲的非常好,毕竟只是一个专栏的入门教程,已经如此深入了,相当有用,这也是我付费了第一个专栏,由于老师讲的好,我在极客时间又订阅的好多,现在已看不过来了,不过这个专栏我一直没断,每天必听必看,感觉学到不少知识。

    嗯,今天讲解的 intrinsic ,我感觉也听明白了,总结一下:
    1:intrinsic-可认为也是一种hotspot虚拟机,为提高JVM性能的优化机制或技巧

    2:使用注解的方式来和Java代码结合

    3:本质上适配出对应系统体系架构,然后直接使用和系统体系架构强关联的高效指令来执行对应的功能

    4:针对不同的类具体的高效指令亦不同

    疑问❓
    1:intrinsic 是只有hotspot虚拟机支持吗?

    2:系统的体系架构适配是唯一的吗?主要是x86_64?按照这个思路是不是可以有多个类似的注视,针对多种的系统体系架构来优化呢?毕竟计算机系统的体系架构是有限的
    2018-09-13
    3
  • Geek_09d838
    我觉得有些功能你要先知道,再去考虑能否会用到这些功能。

    作者回复: 嗯嗯!
    我的想法是,在这个专栏中介绍JVM各个组件的设计与实现。之后当开发人员在遇到性能问题时,能够联想到具体是哪个组件可能出了问题,从而针对性地去做调优。

    2018-09-10
    3
  • Scott
    我还是看得蛮过瘾的,周一三五早上起来第一件事就是看更新,的确可能不是很实用,但是对于对虚拟机感兴趣的同学来讲,是满足了好奇心

    作者回复: 谢谢支持!

    2018-09-10
    2
  • ahern88
    我觉得这份虚拟机教程写的知识有点偏,不够实用,大家觉得呢

    作者回复: 多谢建议!

    JVM对用户来说是透明的,可调优的参数也在逐渐减少,总体朝着自适配前进。所以把本专栏当成工具书来看的话,确实没有多少实用性。

    不过就算是自适配的虚拟机,也有覆盖不到的场景。专栏前面这两部分,正是在介绍JVM各个模块的设计与实现,以便开发人员在发现性能问题时能够联想到可能出问题的具体模块。

    接下来的第三部分会介绍一些性能监控分析工具,希望会对你有所帮助。

    2018-09-10
    2
  • Len
    我觉得老师讲的非常好,尤其是上两讲讲方法内联,结合老师讲的,在课后我又恶补了一下 IR 方面的知识,收获很大。
    尽管目前我的工作不会直接用到这方面的知识,但我相信这些底层机制、原理性的知识点,对成长为一名优秀的工程师是必备的。

    作者回复: 多谢支持!

    2018-09-10
    1
  • 随心而至
    赞,之前学习了深入理解计算机原理这门课,再联系这一节就知道intrinsic想做什么了。
    JVM 自身不是跨平台的,Windows,Linux都有各自的安装包,也就是JVM帮我们做了不同操作系统及底层体系结构的兼容;但是针对每一个具体的CPU,其自身提供的指令,寄存器,以及SIMD等优化机制并没有得到利用,而intrinsic的产生正是为了利用这些。
    个人理解,有不对之处,请老师和各位同学指出。
    2019-10-25
  • asc
    这些东西听着挺过瘾的,虽然大部分时间用不上。但是理解原理,在你查找疑难问题的时候却是有奇效
    2019-09-30
  • 雪人
    这些东西,尽管现在可能看起来不会都懂,但留着以后无论什么时候再看,都会有或多或少的收获,而这个收获,对以后的前进之路,是有非常大的帮助,感谢老师,希望老师有空能再出一份专栏吧
    2019-02-09
  • 白三岁
    我看了下java8中没有找到这个注解。调用从源码复制出来的方法和直接调用源码的方法没有性能上的差别。是java8没有加入这种优化吗

    作者回复: Java8已经有一些intrinsic,但不多。

    这个注解应该是Java 9引入的,它的意思其实是用来提醒JDK开发人员注意虚拟机里有对应的intrinsic,改动的话需要通知我们

    2018-09-27
  • JZ
    Java8中并没有看到相应的注解,如String类的indexOf方法,Java8中没有类似的优化?

    作者回复: 记得是9之后才大量加入的

    2018-09-23
  • 四阿哥
    第三部分,利用工具进行调优,非常期待,其实像PrintCompile这类参数也是十分实用的
    2018-09-12
  • bradsun
    不好意思,昨天没写清楚。就是intrinsic,只有少部分可以直接被解释器应用,而大部分只能被编译器应用。为什么不都可以被解释器调用,这样解释执行的时候不会更高效吗
    2018-09-12
  • bradsun
    这个为什么不都是独立的形式。而且只有少部分是独立的。谢谢

    作者回复: 不好意思没明白你的问题。什么是独立的?

    2018-09-11
收起评论
14
返回
顶部