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,会用到的指令
    论读书
    睁开眼,书在面前
    闭上眼,书在心里
  • 相关阅读:
    JS 数组去重复值
    git 上传项目 到github
    IntelliJ IDEA 创建maven 项目 并且,将springMVC 与Mybatis 整合
    easyui datagrid 动态添加columns属性
    codeMirror的简单使用,js比较文本差异(标注出增删改)
    sql注入
    Web For Pentester靶场
    一些数据库
    nginx的使用场景
    dockerfile
  • 原文地址:https://www.cnblogs.com/YC-L/p/14412572.html
Copyright © 2011-2022 走看看