乐趣区

关于java:JVM系列5JVM常用指令

JVM 系列笔记目录

  • 虚拟机的根底概念
  • class 文件构造
  • class 文件加载过程
  • jvm 内存模型
  • JVM 罕用指令
  • GC 与调优

指令集分类

基于寄存器的指令集

基于栈的指令集

Hotspot 中的 Local Variable Table 相当于 JVM 的寄存器 

运行时数据区

运行时数据辨别 6 个局部:PC、JVM Stack、Heap、MethodArea、Native Method Stack、Direct Memory。

  • PC: 程序计数器,寄存下一条指令的地位。
  • JVM Stack:线程独有的栈,寄存一个个栈帧 (Stack Frame,每个办法对应一个栈帧。

    栈帧组成:

    • Local Variable Table 办法本地的参数表
    • Operand Stack 操作数栈
    • Dynamic Linking 动静链接,简略了解为指向 Runtime Constant Pool 中的符号链接;如果没有解释,将符号援用解析为间接援用的过程;如果已解释,间接用。感兴趣能够浏览下 Oracle 官网 JVM 标准。
    • Return address,返回地址,a() -> b(),办法 a 调用了办法 b, b 办法的返回值放在什么中央
  • Heap:所有线程共享的堆空间,具体在 GC 的章节探讨。
  • MethodArea:办法区,线程共享

    • 寄存每一个 class 的构造
    • 办法区是逻辑上的概念,1.8 前后有不同实现

      1.8 版本前指的是永恒代,字符串常量位于 PermSpace,FGC 不会清理,大小启动的时候指定,不能变。

      1.8 后指的是元数据区 (Meta Space), 字符串常量位于堆, 会触发 FGC 清理, 不设定的话,就是最大的物理内存

    • 办法区中蕴含 RunTime Constant Pool,是 class 中的常量池中的数据运行时寄存的中央
  • Native Method Stack:调用了 C /C++ 本地办法的栈。
  • Direct Memory:JVM 能够间接拜访的内核空间的内存 (OS 治理的内存),应用 NIO,提高效率,实现零拷贝。

运行时数据中 PC、JVM Stack、Native Method Stack 是线程独有的, 而 Heap、Method Area 则是线程共享的。

  • JVM 罕用指令

    如何查看指令的含意?idea 中通过插件 jclasslib 间接点击指令查看,或是查阅 JVM 标准。

    • store 存入 LVT
    • load 从 LVT 取
    • pop 弹栈
    • add 加法
    • mul 乘法
    • sub 减法
    • invoke

      ​ InvokeStatic 调用静态方法

      ​ InvokeVirtual 调用能够多态的办法

      ​ InvokeInterface 调用接口办法

      ​ InvokeSpecial 调用能够间接定位,不须要多态的办法如 private 办法、构造方法

      ​ InvokeDynamic 调用 lambda 表达式或者反射或者其余动静语言 scala kotlin, 或者 CGlib ASM, 动静产生的类会用到的指令,JVM 最难的指令

常识分享,转载请注明出处。学无先后,达者为先!

退出移动版