深入理解Java虚拟机知识图谱
2024-07-25 22:08:35 0 举报
AI智能生成
深入理解Java虚拟机知识图谱
作者其他创作
大纲/内容
走进JVM
Java技术体系
展望Java技术的未来
无语言倾向
新一代即时编译器Graal
向Native迈进
灵活的胖子
语言语法的持续增强
实战:自己编译JDK
JVM内存区域与对象解析
基础
JVM体系概览
类加载子系统
运行时数据区
字节码执行引擎
运行时数据区域
程序计数器
Java虚拟机栈
本地方法栈
Java堆
方法区
运行时常量池
直接内存
OutOfMemoryError异常示例
Java堆溢出示例
虚拟机栈和本地方法栈溢出示例
方法区和运行时常量池溢出示例
本机直接内存溢出示例
对象创建过程
基础
对象完整创建过程
类加载检查
内存分配
初始化零值
设置对象头
执行init方法
创建对象流程源码分析
对象的内存布局
对象的内存布局
对象头
实例数据
对齐填充
估算对象大小
对象的访问定位
运行时数据区综合示例
垃圾收集器与内存分配策略
概述
判断对象是否可回收
引用计数算法
可达性分析算法
finalize()对象自救
引用类型
引用类型分类
引用队列
回收方法区
垃圾收集算法
分代收集理论
分代收集理论基础
基于分代收集的堆基本结构
Minor GC与Full GC
标记-清除算法
标记-复制算法
标记-整理算法
Hotspot虚拟机垃圾收集算法实现细节
根节点枚举
安全点
安全区域
记忆集与卡表
写屏障
并发的可达性分析
三色标记
增量更新与原始快照
写屏障
读屏障
总结
经典垃圾收集器
基础
Serial收集器
ParNew收集器
Parallel Scavenge收集器
Serial Old收集器
Parallel Old收集器
CMS收集器
Garbage First收集器
基础
Region
G1垃圾收集思路
收集流程
停顿时间的设置
G1的优缺点
参数设置
G1垃圾收集的类型
G1应用场景与示例
低延迟垃圾收集器
Shenandoah收集器
ZGC收集器
基础
ZGC的Region与内存布局
ZGC并发整理算法实现与染色指针
ZGC垃圾收集流程
ZGC优缺点与问题
ZCG性能
ZGC参数设置
选择合适的垃圾收集器
内存分配与回收策略
对象栈上分配
对象优先在Eden分配
大对象直接进入老年代
长期存活的对象将进入老年代
动态对象年龄判定
老年代空间分配担保机制
内存泄漏与内存溢出
内存泄漏
基础
内存泄漏原因
内存溢出
处理方法
JVM性能监控与故障处理工具
概述
基础故障处理工具
基础工具总结
jps-虚拟机进程状况工具
jstat-虚拟机统计信息监视工具
jinfo-Java配置信息工具
jmap-Java内存映像工具
jstack-Java堆栈跟踪工具
可视化故障处理工具
JHSDB:基于服务代理的调试工具
JConsole:Java监视与管理控制台
VisualVM:多合一故障处理工具
Hotspot虚拟机插件及工具
HSDIS-JIT生成代码反汇编
堆转储文件
基础
获取堆转储文件
虚拟机及垃圾收集器日志
日志收集配置
GC日志分析示例
jstat调优实例
调优案例分析与实战
GC问题处理与调优方法
GC调优原则
GC调优目的
GC调优策略
GC调优步骤
参数设置方式
虚拟机调优案例分析
大内存硬件上的程序部署策略
集群间同步导致的内存溢出
堆外内存导致的内存溢出
外部命令导致系统缓慢
服务器虚拟机进程崩溃
不恰当数据结构导致内存占用过大
由Windows虚拟内存导致的长时间停顿
由安全点导致长时间停顿
电商系统优化JVM参数(ParNew+CMS)
JVM参数总结
内存分配参数
堆内存
栈内存
年轻代内存
方法区内存
行为参数
性能调优参数
调试参数
垃圾收集器参数
类文件结构
平台无关性
Class类文件结构
魔数与主次版本号
常量池
访问标志
类索引,父类索引与接口索引集合
字段表集合
方法表集合
属性表集合
Code属性
Exceptions属性
InnerClasses属性
运行时注解相关属性
字节码指令简介
字节码与数据类型
加载与存储指令
运算指令
类型转换指令
对象创建与访问指令
操作数栈管理指令
控制转移指令
方法调用与返回指令
异常处理指令
同步指令
共有设计,私有实现
虚拟机类加载机制
概述
类加载的时机
类的生命周期
类加载的时机与主动引用
被动引用的示例
类加载的过程
加载
验证
准备
解析
初始化
类加载器
类与类加载器
类加载器分类
双亲委派模型
概述
双亲委派机制源码分析
自定义类加载器
破坏双亲委派模型
打破方式
被破坏实例
Java模块化系统
模块的兼容性
模块化下的类加载器模型
虚拟机字节码执行引擎
概述
运行时栈帧结构
局部变量表
操作数栈
动态链接
方法返回地址
附加信息
方法调用
(静态)解析
分派
静态分派
动态分派
单分派与多分派
虚拟机动态分派的实现
动态类型语言支持
动态类型语言
Java与动态类型
java.lang.invoke包
invokedynamic指令
实战: 掌控方法分派规则
基于栈的字节码解释执行引擎
解释执行
基于栈的指令集与基于寄存器的指令集
基于栈的解释器执行过程
类加载及执行子系统的案例与实战
概述
类加载综合示例
案例分析
Tomcat:正统的类加载器架构
OSGi:灵活的类加载器架构
字节码生成技术与动态代理的实现
Backport工具:Java的时光机
实战:自己动手实现远程执行功能
目标与思路
实现与验证
前端编译与优化
概述
Javac编译器
Javac的源码与调试
解析与填充符号表
词法和语法分析
填充符号表
注解处理器
语义分析与字节码生成
标注检查
数据及控制流分析
解语法糖
字节码生成
Java语法糖的味道
泛型
Java与C#的泛型
泛型的历史背景
类型擦除
值类型与未来的泛型
自动装箱,拆箱与遍历循环
条件编译
实战:插入式注解处理器
实战目标
代码实现
运行与测试
其他应用案例
后端编译与优化
概述
代码执行模式
即时编译器(JIT)
即时编译器实现
解释器与编译器
编译对象与触发条件
热点代码
热点探测
方法调用计数器
回边计数器
编译过程
提前编译器
提前编译的优劣得失
实战:Jaotc的提前编译
编译器优化技术
优化技术概览
方法内联
逃逸分析
公共子表达式消除
数组边界检查消除
实战:深入理解Graal编译器
历史背景
构建编译调试环境
JVMCI编译器接口
代码中间表示
代码优化与生成
Java内存模型与线程实现
概述
硬件的效率与一致性
基础
多CPU架构
架构组成
CPU读取存储器数据过程
多线程存在的问题
缓存一致性问题
指令重排序问题
Java内存模型(JMM)
主内存与工作内存
JMM与JVM模型的联系
JMM与硬件内存架构的关系
内存间交互操作
内存间交互的8个操作
同步规则
可见性原子性与有序性问题
可见性
原子性
有序性
现行发生原则
指令重排序
概述
重排序导致的可见性问题
重排序的规则
as-if-serial语义
解决指令重排序导致的可见性问题
volatile
volatile的语义(用处)
保证可见性
禁止指令重排序优化
volatile无法保证原子性
synchronized和volatile的区别
拓展问题
内存屏障
Java与线程
线程的实现
内核线程的实现
用户线程的实现
混合实现
Java线程的实现
Java线程调度
Java与协程
内核线程的局限性
协程的复苏
Java的解决方案
线程安全与内置锁优化
概述
线程安全
Java语言中的线程安全
不可变
绝对线程安全
相对线程安全
线程兼容
线程对立
线程安全的实现方法
互斥/阻塞同步
非阻塞同步
无同步方案
内置锁优化
自旋锁与自适应自旋
锁消除
锁粗化
轻量级锁
偏向锁
内置锁优化升级过程
锁膨胀后的优化
其他
收藏
收藏
0 条评论
下一页