zoukankan      html  css  js  c++  java
  • Jvm Runtime 和 Instructions

    A class life cycle

    Run-time data areas

    PC 程序计数器,存放指令位置
    虚拟机的运行,类似于这样的循环

    while(not end) {
       取PC中的位置,找到对应位置的指令;
    ​    执行该指令;
      ​   PC ++;
    }

    JVM Stack

    Frame - 每个方法对应一个栈帧
    Local Variable Table
    Operand Stack

    • 对于long的处理(store and load),多数虚拟机的实现都是原子
    • jls 17.7,没必要加volatile

    Dynamic Linking

    • https://blog.csdn.net/qq_41813060/article/details/88379473 
    • jvms 2.6.3

    return address

    • a() -> b(),方法a调用了方法b, b方法的返回值放在什么地方

    Heap

    Method Area

    1. Perm Space (<1.8)

    • 字符串常量位于PermSpace
    • FGC不会清理
    • 大小启动的时候指定,不能变

    2. Meta Space (>=1.8)

    • 字符串常量位于堆
    • 会触发FGC清理
    • 不设定的话,最大就是物理内存

    Runtime Constant Pool

    Native Method Stack

    Direct Memory

    • JVM可以直接访问的内核空间的内存 (OS 管理的内存)
    • NIO,提高效率,实现zero copy

    如何证明1.7字符串常量位于Perm,而1.8位于Heap

    结合GC, 一直创建字符串常量,观察堆,和Metaspace

    线程共享区域

    每个线程都有自己的PC(程序计数器)

    栈帧Frame

    每个栈帧对应着一个未运行完的函数,栈帧中保存了该函数的返回地址和局部变量

    每一个方法对应一个栈帧

    i++,左值是i本身,局部变量表是i+1

    ++i,左值变成i+1,局部变量表也是i+1

    指令集

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

    栈的执行流程

    load,压栈,store,弹栈

    DCL(双重检查锁模式)为什么使用volitaile

    有可能发生指令重排

    递归的调用

    Invoke指令

    InvokeStatic

    InvokeVirtual

    InvokeInterface

    InovkeSpecial

    • 可以直接定位,不需要多态的方法
    • private 方法 , 构造方法

    InvokeDynamic

    • JVM最难的指令
    • lambda表达式或者反射或者其他动态语言scala kotlin,或者CGLib ASM,动态产生的class,会用到的指令
    论读书
    睁开眼,书在面前
    闭上眼,书在心里
  • 相关阅读:
    C#低级Windows API钩子拦截键盘输入
    PowerDesigner 11 使用心得
    c# windows服务状态、启动和停止服务
    PowerDesigner设计数据库
    C# Windows帐户和目录添加用户权限方法
    ASP.NET的控件Gridview在Firefox中的Border显示问题
    去掉图片连接的虚框
    http://www.ediyang.com/demo/DD_Png/
    WEB前端开发规范文档(for: mrthink.net)
    .net下载文件的常用方法汇总
  • 原文地址:https://www.cnblogs.com/YC-L/p/14412572.html
Copyright © 2011-2022 走看看