• 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,会用到的指令
    论读书
    睁开眼,书在面前
    闭上眼,书在心里
  • 相关阅读:
    wzplayer,tlplayer正式支持扩展dlna协议
    ASP.NET导出Excel或Word文件格式
    .NET对象序列化:TimeSpan
    探讨.NET中的联合结构
    浅析ASP.NET应用Autofac获取页面服务
    ASP.NET封装JS文件到DLL中并在页面中调用
    MySQL和MongoDB设计实例对比
    .NET中的异步编程:使用F#简化异步编程
    ASP.NET MVC 2自定义验证
    ASP.NET Session丢失问题原因及解决方案
  • 原文地址:https://www.cnblogs.com/YC-L/p/14412572.html
Copyright © 2020-2023  润新知