前言

本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见100个问题搞定Java虚拟机

正文

HotSpot 虚拟机将对标注了@HotSpotIntrinsicCandidate注解的方法的调用,替换为直接使用基于特定 CPU 指令的高效实现。
这些方法我们便称之为 intrinsic。

intrinsic 的实现

  1. 桩程序,可以在解释执行或者即时编译生成的代码中使用。
  2. 特殊的 IR 节点。即时编译器将在方法内联过程中,将对 intrinsic 的调用替换为这些特殊的 IR 节点,并最终生成指定的 CPU 指令。

在编译原理课程中,我们通常将编译器分为前端和后端。
其中,前端会对所输入的程序进行词法分析、语法分析、语义分析,然后生成中间表达形式,也就是 IR(Intermediate Representation )

已有 intrinsic 简介

最新版本的 HotSpot 虚拟机定义了三百多个 intrinsic。

在这三百多个 intrinsic 中,有三成以上是 Unsafe 类的方法。

关于 Unsafe 类请参考我的这篇博客——一篇文章搞懂 Java 中的 Unsafe 类

不过,我们一般不会直接使用 Unsafe 类的方法,而是通过 java.util.concurrent 包来间接使用。

举个例子,Unsafe 类中经常会被用到的便是 compareAndSwap 方法(Java 9+ 更名为 compareAndSet 或 compareAndExchange 方法)。

在 X86_64 体系架构中,对这些方法的调用将被替换为lock cmpxchg 指令,也就是原子性更新指令。

除了 Unsafe 类的方法之外,HotSpot 虚拟机中的 intrinsic 还包括下面的几种。

1. StringBuilder 和 StringBuffer 类的方法。

HotSpot 虚拟机将优化利用这些方法构造字符串的方式,以尽量减少需要复制内存的情况。

JDK9 的字符串底层原理是什么?

2. String类、StringLatin1类、StringUTF16类和Arrays类的方法。

HotSpot 虚拟机将使用 SIMD 指令(single instruction multiple data,即用一条指令处理多个数据)对这些方法进行优化。

举个例子,Arrays.equals(byte[], byte[])方法原本是逐个字节比较,在使用了 SIMD 指令之后,可以放入 16 字节的 XMM 寄存器中
(甚至是 64 字节的 ZMM 寄存器中)批量比较。

关于 SIMD 可以参考我的这篇博客——即时编译器的向量化优化是什么?SIMD 到底是什么?

3. 基本类型的包装类、Object类、Math类、System类中各个功能性方法,反射 API、MethodHandle类中与调用机制相关的方法,压缩、加密相关方法。

HotSpot虚拟机中的intrinsic是指什么?相关推荐

  1. JVM基础 之Java HotSpot虚拟机中的内存管理

    1  简介 依托JavaTM 2平台的力量,标准版(J2SETM)实现了内存的自动管理,将开发人员从复杂的显式内存管理中解放出来. 本文将对Sun公司的J2SE发行版中的Java HotSpot虚拟机 ...

  2. JVM-02内存区域与内存溢出异常(中)【hotspot虚拟机对象】

    文章目录 思维导图 对象的创建 对象的内存布局 实例数据(Instance Data) 对齐填充(Padding) 对象的访问定位 使用句柄(类似间接指针) 直接指针访问 (HotSpot采用这种方式 ...

  3. HotSpot虚拟机在java堆中的内存使用

    1  简介 依托JavaTM 2平台的力量,标准版(J2SETM)实现了内存的自动管理,将开发人员从复杂的显式内存管理中解放出来. 本文将对Sun公司的J2SE发行版中的Java HotSpot虚拟机 ...

  4. HotSpot虚拟机在Java堆中对对象的管理

    在大概了解了Java虚拟机中内存的大致分布后,接下来就应该了解虚拟机是如何在内存中管理对象的,毕竟Java是一门面向对象的语言,在Java程序的运行过程中会不断有对象创建出来.为了方便,这里仅仅以Ho ...

  5. JVM成神之路-HotSpot虚拟机-编译原理、JIT、编译优化

    Java编译原理 什么是字节码.机器码.本地代码? 字节码是指平常所了解的 .class 文件,Java 代码通过 javac 命令编译成字节码 机器码和本地代码都是指机器可以直接识别运行的代码,也就 ...

  6. 深入理解Java虚拟机(二)——HotSpot虚拟机对象

    一.对象的创建 1.检查 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载.解析和初始化过.如果没有,那必须先执 ...

  7. 一文看懂虚拟机中Java对象的生死判别

    j3_liuliang 通过上面两篇的介绍,相信大家已经知道虚拟机的内存布局和对象创建的过程及在虚拟机中的分布的,那么一个对象创建出来是不可能永生的总会有死亡的时候而虚拟机是如何判定一个对象的生死那就 ...

  8. JVM hotspot虚拟机对象探秘

    为什么80%的码农都做不了架构师?>>>    本文全部内容均转述自<深入理解Java虚拟机 JVM高级特性与最佳实践(第二版)>2.3节 下载地址:http://pan ...

  9. Hotspot虚拟机的对象

    创建 Step1:类加载检查 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过.解析和初始化过.如果没有,那 ...

最新文章

  1. PL/SQL集合类型的整理学习
  2. Nature子刊:用16S及18S rRNA全长进行微生物多样性研究
  3. Android混合推送,MUI框架-推送配置核心代码-个推推送
  4. Outlook 2003命令行参数开关详解
  5. BZOJ1296:[SCOI2009]粉刷匠
  6. Table城市代码翻译
  7. python编程口诀_科学网—Python编程技巧汇总 - 高关胤的博文
  8. 60秒ICO募资2.35亿,AI+区块链概念,这个风口上的公司有点怪
  9. 关于new FormData() 对象的用法
  10. 人人开源代码生成器启报错
  11. 树莓派Ubuntu18.04使用及联网
  12. python自动提交网页表单_Python 自动化表单提交实例代码
  13. 模型调参(一):weight decay(权重衰减)【“权重衰减”也叫“L1/L2正则化”】【权重衰减系数:正则项系数 λ】【对参数w有影响、对偏置b没影响】【偏置不加正则】
  14. [docker]dockerfile简介与应用
  15. 《麻省理工学院公开课:人工智能》笔记一
  16. 高项_第十三章项目合同管理
  17. Flume 1.9.0用户指南
  18. 2022年浙江省中职组“网络空间安全”编码信息获取
  19. 4.20 视频面试字节_光大银行_神策
  20. 如何破解网络密码?(2种方法)

热门文章

  1. ActionSheet样式UIAlertController的正确使用
  2. 供应链对全球手机市场相当悲观,iPhone出货量将进一步下滑
  3. matlab中设置拟合初值,matlab中的nlinfit函数时,参数需要回归系数的初值,如何确定?...
  4. Linux、查看网关、重启网关的命令
  5. abp vnext安装模块
  6. npm ERR vue-manage@0.1.0 serve: vue-cli-service serve
  7. virtualenv创建虚拟环境
  8. java离散_离散值计算方法JAVA实现
  9. 数据报(datagram)网络与虚电路(virtual-circuit)网络是典型两类分组交换网络。
  10. 小程序源码:洗衣店v2.5.0微信小程序