jvm虚拟机——体系结构

JVM虚拟机

  1. 虚拟机的基础概念
    1. 概念:执行字节码文件的虚拟机,包含
      1. 类加载器
      2. java类库
      3. 字节码解释器
      4. JIT及时编译器-常用代码做成本地编译,类似编译成C语言中的exe文件
      5. 执行引擎-与硬件进行交互
    2. 目前流行的jvn虚拟机-常见的实现
      1. Hotspot
      2. Jrockit-曾经最快的JVM,后被Oracle收购
      3. J9-IBM
      4. Microsoft VM
      5. TaobaoVM-阿里基于Hotspot深度定制版
      6. LiquidVM-面向硬件的虚拟机
      7. azul zing-最新垃圾回收界的标杆,贵,快——垃圾回收1ms内
    3. 跨平台语言&跨语言平台——jvm和java是两个东西
      1. 跨平台语言:java
        1. 通过jvm与各种操作系统进行交互
        2. jvm,jre,jdk
          1. jvm虚拟机
          2. jre = jvm + core lib
          3. jdk = jre + development kit
      2. 跨语言平台:JVM
        1. java,scala,kotlin,grovey…一百多种语言可在jvm上运行
        2. 只要编译成class文件类型就可以在JVM上运行
        3. jvm是一种规范
        4. 是一台虚构出来的计算机
          1. 字节码指令集
          2. 内存管理:堆,栈,方法区
        5. jvm是一种规范,调优是对规范的合理实现
    4. 体系结构
      1. 类加载
      2. 基础数据类型
      3. 编译过程
      4. 加载,链接和初始化
      5. jvm指令集
  2. 类结构-Class File Format
    1. 本质:二进制字节流,有java虚拟机解释
    2. 数据类型:u1 u2 u4 u8 _info
    3. 16进制Classfile
    4. ByteCode工具
      1. javap
      2. JBE
      3. JClassLib
    5. class文件构成
      1. MagicNumber魔数-4byte
      2. class文件版本号Minor Version-2byte、Major Version-2byte
      3. ConstantPool常量池-2byte
        1. 常量池相关
        2. 常量池类型(15种类型)
      4. AccessFlags-修饰符
      5. 类名,父类名
      6. 接口及实现
      7. Fields_count属性,具体属性
      8. Methods方法,具体方法
      9. 附加属性attributes
    6. 常用工具
  3. 内存加载过程
    1. 自定义ClassLoader
    2. 类的加载过程
      1. Loading-将文件加载到内存
      2. Linking
        1. Verification校验
        2. Preparation准备(把静态变量赋默认值)
        3. Resolution解析
      3. Initializing初始化——静态变量赋为初始值
        1. load-赋默认值-赋初始值
        2. new-申请内存-默认值-初始值
      4. 使用Using
      5. 卸载UNLoading
    3. ClassLoader类加载器:按需动态加载,双亲委派机制-先向上找,再向下委托-主要是为了安全考虑
      1. Bootstrap-最核心类加载器C++实现,加载lib/rt.jar charset.jar等核心类
      2. Extension-加载扩展包中的文件
      3. APP-加载classpath指定内容
      4. Customer-ClassLoader
      5. 打破双亲委派机制-
        1. 如何打破重写l=LoadClass()
        2. 何时打破
          1. jdk1.2之前自定义ClassLoader必须重写LoadClass()
          2. ThreadContextClassLoader实现基础类调用,通过thread.setContextClassLoader指定
          3. 热启动,热部署-osgi和tomcat有自己的classloader
    4. Initializing-lazyInitializing懒加载
      1. 初始化时间
      2. 反射调用
      3. JVM并没有规定何时加载,但规定了什么时候必须加载
    5. LazyLoading五种情况
      1. new getstatic putstatic invokestatic
      2. 对类进行反射调用
      3. 初始化子类的时候父类首先初始化
      4. 虚拟机启动的时候,主类必须初始化
      5. 动态语言支持
    6. 编译模式
      1. 解释器-bytecode interpreter
      2. JIT-just In-Time compiler
      3. 混合模式
        1. 混合使用解释器
        2. 解释执行
        3. 代码检测
          1. 方法计数器(检测方法执行频率)
          2. 循环计数器(检测循环执行)
          3. 编译
          4. 混合模式-Xmixed
          5. 编译模式-Xint启动快,执行慢
          6. 纯编译模式-Xcomp 执行快,启动慢
  4. JMM-Java Memory Model-java内存模型
    1. 硬件层的并发优化基础知识
      1. 存储器的层次结构
        1. L0-寄存器  ——    1 cycle   <1ns
        2. L1-高速缓存——3-4 cycle—— 1ns
        3. L2-高速缓存——10 cycle——  3ns
        4. L3-高速缓存——40-45cycle——15ns
        5. L4-主存——60-80ns
        6. L5-磁盘
        7. L6-远程文件存储
      2. 缓存一致性协议-
        1. Intel-MESI缓存锁
        2. 总线锁,适用场景
          1. 无法被缓存的数据
          2. 跨越多个缓存行
        3. 缓存行对齐
          1. 缓存行:读取缓存的基本单位,一般为64byte
          2. 伪共享:位于同一缓存行的两个数据,被两个不同的CPU锁定,产生互相影响的伪共享问题
          3. 缓存行对其可以提高程序运行的效率
      3. 乱序执行
    2. 指令重排
      1. 有序性
      2. CPU内存屏障(X86)
        1. sfence:store|在sfence指令后的写操作前完成
        2. Ifence:load|在Ifence读操作前完成
        3. mfence:modify/mix|必须在mfence指令后的读写操作前完成-全能屏障
      3. jvm内存屏障
        1. LoadLoad
        2. StoreStore
        3. LoadStore
        4. StoreLoad-全能屏障
        5. volatile实现细节
          1. 字节码层面-加一个ACC_VILATILE
          2. JVM层面
            1. 写操作:前后都加内存屏障,前:StoreStoreBarrier,后:StoreLoadBarrier
            2. 读操作:前:LoadLoadBarrier后:LoadStoreBarrier
          3. OS和硬件层面
            1. windows lock指令实现对内存去加锁
            2. hsdis观察汇编吗-Hotspot Dis Assembler
        6. Synchronize
          1. 字节码层面
            1. ACC_SYNCHRONIZED
            2. monitorenter& monitorexit
          2. JVM层面:C和C++调用了操作系统提供的同步机制
          3. OS层面:lock cmpxchg/xxx指令
    3. 8大原子指令(了解即可)
      1. lock unlock read load use assign store write
    4. happens before原则-java 重排序必须遵守的规则
      1. 次序规则
      2. 管程锁定规则
      3. volatile变量规则
      4. 线程启动规则
      5. 线程中止规则
      6. 线程中断规则
      7. 对象终结规则
      8. 传递性
    5. as if serial:不管如何重排序,单线程执行结果不会改变
  5. 对象内存布局
    1. 对象创建过程
      1. class loading
      2. class linking(verification,preparation,resolution)
      3. class Initializing
      4. 申请对象内存
      5. 成员变量赋值
      6. 调用构造方法<init>
        1. 成员变量顺序赋值
        2. 执行构造方法语句
    2. 对象内存布局
      1. 观察虚拟机配置
      2. 普通对象
        1. 对象头:markword 8
        2. ClassPointer指针:XX:UseCompressedClassPointers-4字节,不开启为8字节
        3. 实例数据
          1. 引用类型:-XX:UseCompressedClassPointers-4字节,不开启为8字节
        4. Padding对齐:8的倍数
      3. 数组对象
        1. 对象头-同上
        2. ClassPointer指针-同上
        3. 数组长度4字节
        4. 数组数据
        5. 8倍对齐
      4. 对象头-markword 8 byte-64位-25位没用(不同的状态下内存分配不同)
        1. 锁状态-2位
          1. 无锁-01
          2. 轻量锁-00
          3. 重量锁-10
        2. GC标记:空
        3. 是否偏向锁-1位
        4. 线程ID:Epoch
        5. 分代年龄-4位-默认为15(最大值)
        6. hashcode-31位
          1. 默认hashcode:System.identityHashCode
          2. 重写后的hashcode
      5. 对象定位
        1. 句柄池-间接指针-垃圾回收效率高
        2. 直接指针-hotspot-对象定位效率高
  6. 运行时内存结构
    1. Program Counter
    2. JVM Stack
    3. Native Stack
    4. Heap
    5. Meathod Area
    6. Stack Frame
      1. Local Vvariable Table
      2. Operand Stack
  7. JVM常用命令
    1. load
    2. store
    3. add
    4. pop
    5. dup
    6. invoke_XXX
    7. Idc
  8. GC与调优
    1. 什么是垃圾,以及如何产生
    2. Java,C,C++垃圾回收对比
    3. 垃圾定位算法
      1. RC
      2. Root Searching
    4. 垃圾回收算法
      1. Mark Sweep
      2. Copying
      3. Mark Compact
    5. 对内存逻辑结构
      1. Eden
      2. Suvivor
      3. Tenured
    6. 对象的分配过程
      1. TLAB
    7. 常用垃圾回收器
      1. Serial/Serial Old
      2. PS/Parallel Old
      3. ParNew
      4. CMS
      5. Epsilon
      6. G1
      7. ZGC
      8. Shenandoah
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值