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