《jvm学习笔记》JVM初识

编程

  • 运行时数据

  • 帧栈

  • 虚拟机启动

  • 虚拟机指令集

  • 整数的表达

    • 原码:第一位为符号位(0为正数,1为负数)

    • 反码:符号位不变,,原码取反

    • 负数补码:符号位不变,,反码加1

    • 正数补码:和原码相同

    • 打印数字的二进制表示形式

    //整数有32位  

    int a = -6;

    //0x80000000

    //11111111111111111111111111111010

    //01000000000000000000000000000000

    //1

    for (int i = 0; i < 32; i++) {

    int t = (a & 0x80000000 >>> i) >>> (31 - i);

    System.out.print(t);

    }

    • 补码 :没有歧义的表示0 、很好的参与运算

    浮点数表示

    • IEEE 754

      s eeeeeeee mmmmmmmmmmmmmmmmmmmm

      第一位是符号位 :s

      紧接着八位表示指数位:e

      剩余23位表示尾数: m

    • 如果e全0 尾数附加位为0 否则为1

    • sm2^(e-127)

    jvm启动流程

    1.装载配置。根据当前路径和系统版本寻找jvm.cfg

    2.根据配置寻找jvm.dll

    3.初始化jvm获得JNIEnv接口。findClass等操作通过它实现

    4.运行main方法

    jvm基本结构

    PC寄存器

    • 每一个线程拥有一个PC寄存器

    • 在线程创建时 创建

    • 指向下一条指令的地址

    • 执行本地方法时,PC的值为undefined

    方法区

    • 保存装载的类信息

      • 类型常量池

      • 字段、方法

      • 方法字节码

    • 通常和永久区 Perm(相对静止、相对稳定的数据)关联在一起

    • 对象保存在堆中

    • 所有线程共享java堆

    • 线程私有

    • 栈由一系列帧组成(帧栈)

    • 栈保存一个方法的局部变量、操作数栈、常量池指针

    • 每一个方法调用创建一个帧,并压栈

    • 栈上分配

      • 小对象,没有逃逸的情况下,可直接分配在栈上

      • 直接分配在栈上,可以自动回收,减轻GC压力

      • 对象或者逃逸对象无法栈上分配

    内存模型

    • 每一个线程有一个工作内存和主存独立

    • 工作内存存放主存中变量的值的拷贝

    • volatile不能代替锁

    以上是 《jvm学习笔记》JVM初识 的全部内容, 来源链接: utcz.com/z/513109.html

    回到顶部