JVM虚拟机
2019-11-12 14:02:22 22 举报
AI智能生成
JVM虚拟机相关知识点
作者其他创作
大纲/内容
Java内存区域划分
运行时数据区
Java堆(Heap)
堆内存划分
新生代
老年代
分配缓冲区
OutOfMemoryError
直接内存
Java堆和Native堆比较
Java虚拟机栈
局部变量表(Java栈 Stack)
存储数据类型
基础数据类型
对象引用类型
returnAddress类型
局部变量空间 Slot
相关异常
StackOverflowError
OutOfMemoryError
本地方法栈
程序计数器
方法区
存储数据
类信息
常量
静态变量
及时编译器编译后代码
运行时常量池
OutOfMemoryError
执行引擎
本地库接口
本地方法库
内存各部分异常测试方法
测试:Java堆溢出
测试:栈溢出
测试:方法区、常量池溢出
测试:直接内存溢出
Java堆中的对象
对象的创建
对象在内存中的分配
内存分配
分配方式
指针碰撞
空闲列表
内存分配线程并发安全
虚拟机CAS保证
本地线程分配缓存
内存初始化
对象数据初始化
对象的内存布局
对象头
实例数据
对齐填充
对象的访问定位
使用句柄
直接指针
使用句柄 和 直接指针 对比
垃圾收集器与内存分配策略
内存回收范围
方法区回收
对象存活算法
引用计数算法
可达性分析法
GC Roots对象来源
虚拟机栈中引用的对象
本地方法栈中引用的对象
方法区中静态变量引用的对象
方法区中常量引用的对象
引用关系
强引用
软引用
弱引用
虚引用
判断对象是否需要收集
垃圾收集算法
标记-清除算法
复制算法
标记整理算法
分代收集算法
HotSpot垃圾收集算法实现
枚举根节点
准确式GC
安全点
安全区域
垃圾收集器
新生代
Serial收集器
ParNew收集器
Parallel Scavenge收集器
老年代
Serial Old收集器
Paraller Old收集器
CMS收集器
处理过程
初始标记
并发标记
重新标记
并发清除
缺点
降低吞吐量
无法处理浮动垃圾
浮动垃圾
产生大量空间碎片
G1收集器
主要特点
内存布局差异
Region引用关系维护
垃圾收集过程
初始标记
并发标记
最终标记
筛选清除
解读GC日志
内存分配与回收策略
普遍的内存分配规则
优先在Eden上分配
大对象直接进入老年代
长期存活对象进入老年代
动态判断对象年龄
空间分配担保
Java虚拟机执行子系统
Class文件
Class文件简述
Class文件结构
无符号数
表
各个数据项存储(嵌套)结构
表中主要数据项含义
1、魔数
2、版本号
3、常量池
常量池容量
存放数据
字面量
符号引用
类和接口全限定名
字段名称和描述符
方法的名称和描述符
常量池的项目类型总览
项目类型对应表的表结构
常量计算
自动生成的常量作用
4、访问标志
5、类、父类及接口索引标志
6、字段表集合
7、方法表集合
方法特征签名
属性表集合
Code属性
常量名称Code
属性长度
最大操作数栈
局部变量存储空间
字节码指令长度
字节码指令
Exception属性
LineNumberTable属性
LocalVariableTable属性
SourceFile属性
ConstantValue属性
InnerClass属性
Deprecated及Synthetic属性
StackMapTable属性
Signature属性
BootstrapMethods属性
字节码指令简介
字节码数据类型
加载与存储指令
运算指令
类型转换指令
对象创建与访问指令
操作数栈管理命令
控制转移指令
方法调用和返回指令
调用类方法
调用特殊处理实例方法
调用对象实例方法
调用接口方法
调用动态方法
异常处理指令
同步指令
虚拟机加载机制
Class文件加载过程
1、加载
类加载时机
加载过程
Class文件来源
数组类创建
加载与连接
2、验证
文件格式验证
元数据验证
字节码验证
符号引用验证
3、准备
4、解析
符号引用和直接引用对比
引用规则
解析对象
类和接口解析
字段解析
类方法解析
接口方法解析
5、初始化
类构造器<clinit>方法
实例构造函数<init>方法
6、使用
7、卸载
类加载器
类的唯一性
双亲委派模型
启动类加载器
扩展类加载器
应用程序类加载器
自定义类加载器
破坏双亲委派模型
JNDI
JDBC
虚拟机字节码执行引擎
运行时栈帧结构
有效栈帧
局部变量表
动态链接
方法返回地址
操作数栈
方法调用
确定要调用的方法
可确定调用方法
静态方法
私有方法
实例构造器
父类方法
不可确定调用方法
动态方法
方法分派
静态分配
重载方法的选择
变量自动转型
静态类型
实际类型
动态分配
invokevirtual指令多态查找过程
虚拟机动态分派的实现
虚方法表
单分派和多分派
“宗量”
变量引用类型
方法签名
动态类型语言支持
java.lang.invoke
MethodHandle
基于栈的字节码执行引擎
解释执行
栈指令集和寄存器指令集
解释器执行过程
程序编译与代码优化
编译期优化
运行期优化
JAVA内存模型与线程
相关硬件概念
每秒事务处理数 TPS
处理器缓存一致性协议
处理器乱序执行与JAVA指令重排序
java代码编译执行
内存模型 JMM
主内存
线程工作内存
主内存和线程内存之间的8种操作
指令操作规则
并发安全-先行发生原则
程序次序规则
管程锁定规则
volatile变量规则
线程启动规则
线程终止规则
线程中断规则
对象终结规则
先行传递队则
volatile型变量
特性
线程可见性
禁止指令重排序
指令重排序规则
适用规则
示例场景
状态控制
对64位数据的读写
volatile 与 synchronized 对比
Java多线程实现
通用实现方式
使用内核线程实现
使用用户线程
用户线程加轻量级进程混合实现
线程安全与锁优化
共享数据线程安全程度
不可变
this引用逃逸
绝对线程安全
相对线程安全
线程兼容
线程对立
虚拟机线程安全实现方法
互斥阻塞同步
synchronized 关键字
同步过程
性能问题
ReentrantLock 可重入锁
等待可中断
可实现公平锁
绑定多个条件
synchronized 和 ReentrantLock 比较
互斥要素
临界区
互斥量
信号量
存在问题
非阻塞同步
单条指令完成多个操作
测试并设置
获取并增加
交互
比较并交换(CAS)
家在连接/条件存储
CAS操作
原理
存在问题
无同步-天生线程安全
可重入代码-局部变量
线程本地存储
生产-消费模式
锁优化
适应性自旋锁
锁消除
锁粗化
轻量级锁
偏向锁
JVM调试
JDK命令行工具
jps
jstat
查看类加载信息
查看垃圾回收信息
查看新老代内存信息
jinfo
动态修改参数
jmap
获取堆转储快照方法
使用jmap命令
设置OOM相关参数
按键触发可控生成
jhat
jstack
hsdis
可视化工具
JConsole
jdk/bin/jconsole.exe
VisualVM
jdk/bin/jvisualvm.exe
连接阶段
0 条评论
下一页