JVM虚拟机(1)

class文件结构

  1. MagicNumber:文件类型
  2. Minor Version:小版本标识
  3. Major Version:大版本号
  4. constant_pool_count:常量池数量
  5. constant_poo:常量池具体实现
  6. access_flags:class文件修饰符
  7. this_class:当前类名
  8. super_class:父类名
  9. interfaces_count:实现接口数
  10. interfaces:实现接口
  11. fields_count:字段数
  12. fields:具体字段
  13. methods_count:方法数
  14. methods:具体方法
  15. attributes_count -u2:其他属性数
  16. attributes:其他属性具体实现

javap命令

JBE 可以直接修改

jClasslib

类加载与初始化

  1. Loading

    1. 双亲委派机制,主要出于安全来考虑。先自Custom ClassLoad向上检查该类是否已经加载,已经加载则返回,如果直到Bootstrap也未查找到内存中有加载,则自顶向下加载,加载完成则返回。

      • Bootstrap:加载lib/rt.jar charset.jar等核心类,C++实现
      • Extension:加载扩展jar包 jre/lib/ext/*.jar或由-Djava.ext.dirs指定
      • App:加载classpath指定内容
      • Custom ClassLoad:自定义ClassLoad
    2. LazyLoading五中情况

      • new getstatic putstatic invokestatic指令,访问final变量除外
      • java.lang.reflect对类进行反射调用
      • 初始化子类的时候,父类首先初始化
      • 虚拟机启动时,被执行的主类必须初始化
      • 动态语言支持java.lang.invoke.MethodHandle解析的结果为REF_getstatic REF_putstatic REF_invokestatic的方法句柄时,该类必须初始化
    3. ClassLoader

      findInCache:先在内存中查找是否加载,已加载则返回,否则去parent.LoadClass中继续先查找内存中是否加载过此类,否则继续去parent.LoadClass直到最高级,如果还是没有找到则从顶级开始findClass加载类到内存。

  2. Linking

    • Verification:验证文件是否符合JVM规定
    • Preparation:静态成员变量赋默认值
    • Resolution:将类、方法、属性等符号引用解析为直接引用,常量池中的各种符号引用解析为指针、偏移量等内存地址的直接引用
  3. Initializing

    调用类初始化代码,给静态成员变量赋初始值

对象在内存中的存储布局

  • 对象头:markword 8个字节
  • ClassPointer指针:-XX:+UseCompressedClassPointers 为4个字节,不开启为8个字节
  • 实例数据:引用类型(如String)-XX:+UseCompressedOops 为4个字节,不开启为8个字节
  • Padding:对齐为8的倍数

对象头(64位)

锁状态 31bit 4bit 1bit(是否偏向锁) 2bit(锁标志位) 26bit
无锁态 对象的hashCode 分代年龄 0 01 unused
轻量级锁 指向栈中锁记录的指针 00
重量级锁 指向互斥量(重量级锁)的指针 10
GC标记 11
偏向锁 线程ID Epoch、分代年龄 1 01

混合模式

解释器+JIT

  • 混合使用解释器 + 热点代码编译
  • 起始阶段采用解释执行
  • 热点代码检测
    • 多次被调用的方法(方法计数器:检测方法执行频率)
    • 多次被调用的循环(循环计数器:检测循环执行频率)
    • 进行编译
    • -Xmixed默认为混合模式,开始解释执行,启动速度较快,对热点代码实行检测和编译
    • -Xint使用解释模式,启动很快,执行较慢
    • -Xcomp使用纯编译模式,执行很快,启动很慢
posted @ 2020-10-30 22:53  R.困兽  阅读(66)  评论(0编辑  收藏  举报