• JVM系列【5】JVM常用指令


    JVM系列笔记目录

    • 虚拟机的基础概念
    • class文件结构
    • class文件加载过程
    • jvm内存模型
    • JVM常用指令
    • GC与调优

    指令集分类

    基于寄存器的指令集

    基于栈的指令集
    Hotspot中的Local Variable Table相当于JVM的寄存器

    运行时数据区

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

    file

    • 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则是线程共享的。

    file

    • 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最难的指令

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

  • 相关阅读:
    实现Oracle的字符串分割(split)[摘录]
    批处理加密[转摘]
    .NET Framework 3.5 SP1安装时下载文件问题及精简方法[转载]
    Oracle 管道化表函数(Pipelined Table)[转载]
    FCKeditor只读与编辑状态切换的不完全解决方案[原创]
    C# Web开发中弹出对话框的函数[转载]
    广发信用卡提现手续费及利息计算器VB源码[原创]
    提升个人网站流量的工具集合(真实IP流量)[转载]
    12.26 3日沙盘Top20分析
    12.29 股票量能沙盘分析软件更新
  • 原文地址:https://www.cnblogs.com/kongbubihai/p/13806264.html
Copyright © 2020-2023  润新知