JVM
2020-03-24 12:02:14 1 举报
AI智能生成
jvm知识体系思维导图,阐述了jvm的基础知识和性能优化
作者其他创作
大纲/内容
4-垃圾回收
垃圾对象识别<br>
引用计数法
可达性分析
GCRoot
虚拟机栈中的本地变量<br>
static成员
常量引用
本地方法栈中的变量
类加载器
Thread
垃圾收集算法
标记-清除
空间碎片,内存不连续
标记和清除都比较耗时,效率低
复制
弊端<br>
空间浪费
优势
空间连续
标记-整理
分代收集算法<br>
新生代
复制算法,适用于少量对象存活的场景
老年代
标记/清除或标记/整理<br>
垃圾收集器
考量<br>
吞吐量
停顿时间
收集器<br>
串行收集器
Serial
Serial Old
并行收集器 吞吐量优先<br>
ParNew
Paraller Scavenge<br>
Paraller Old<br>
并发收集器 停顿时间优先<br>
CMS
G1
如何选择
官方指导策略<br>
G1收集器使用
开启需要的垃圾收集器
5-JVM参数
参数分类
标准参数<br>
-X参数<br>
-Xx参数
Boolean类型
非Boolean类型
其他参数
查看参数
设置参数
开发工具中设施<br>
运行jar: java -XX:+UseG1GC xxx.jar
web容器,比如Tomcat,在启动脚本中
jinfo实时调整某个java进程的参数
常用参数
实用参数文章<br>
JVM参数生成
7-JVM工具
常用命令
查看Java进程:jps
jinfo
实时查看jvm参数
实时调整jvm参数
查看虚拟机性能统计信息:jstat
查看线程堆栈信息:jstack
生成堆快照:jmap
打印堆内存信息
查看堆上对象分布情况
dump出堆内存相关信息
堆内存溢出时自动dump
常用工具<br>
jconsole
jvisualvm
arthas
java堆分析器:MAT
GC日志分析
gceasy
GC日志打印<br>
GCViewer
8-JVM性能优化
GC优化
引发GC的情况<br>
Eden区或S区不够用
old区不够用<br>
方法区空间不够用
System.gc<br>
GC日志分析
G1日志
G1调优
官网建议
最佳指南<br>
JIT
HotSpot编译
C1 client,编译速度快,优化比较保守<br>
C2 server,编译速度慢,优化比较激进<br>
C1+C2 分层编译,jdk1.8前默认关闭<br>
热点检测<br>
基于采样方式探测
基于计数器的热点探测
编译优化
CodeCache
-XX:InitialCodeCacheSize 初始大小<br>
-XX:ReservedCodeCacheSize 最大大小<br>
逃逸分析<br>
-XX:+EliminateLocks 同步消除
-XX:+EliminateAllocations 标量替换
栈上分配
编译阀值
client 默认1500<br>
server 默认10000<br>
栈上替换
高并发场景分析<br>
优化指南
发现问题
GC频繁
死锁
OOM
线程池不够用
CPU负载过高
排查问题
打印GC日志,查看minor gc和major gc<br>
jstack查看线程堆栈信息<br>
dump出堆文件,使用MAT分析
合理使用jconsole\jvisualvm\arthas等工具实时查看jvm状态
灵活应用jps\jinfo\jstat\jmap等命令
解决方案
适当增加堆内存/选择合适的垃圾收集器
使用zk、redis等实现分布式锁
设置本地、nginx缓存减少对后端服务的访问
后端代码优化及时释放资源、合理设置线程池的参数<br>
集群部署,减少单点压力<br>
利用一些消息中间件实现异步消息
其他问题补充
内存泄漏与内存溢出
major gc与full gc<br>
G1和CMS区别<br>
不可达的对象一定会被回收吗?
方法区中的无用类回收<br>
不同的引用
STAB与Incremental Update
1-JVM位置<br>
JDK架构图
JVM官方文档
2-源码编译
编译过程
编译原理
源文件编译为类文件过程
类文件<br>
16进制文件<br>
字节码文件
反编译字节码指令解释<br>
3-类加载
类加载机制
装载
通过一个类的全限定名获取定义此类的二进制字节流<br>
将这个字节流代表的静态存储结构转化为方法区的运行时数据结构<br>
在堆中生成一个代表这个类的对象,作为对方法区中这些数据的访问入口
链接<br>
验证
文件格式验证
元数据验证
字节码验证
符号引用验证
准备
为类的静态变量分配内存,并将其初始化为默认值
解析
将类中的符号引用转换为直接引用
初始化
对类的静态变量、静态代码块执行初始化操作
类装载器
分类
BootStrap ClassLoader<br>
Extension ClassLoader<br>
App ClassLoader<br>
自定义ClassLoader<br>
双亲委派机制<br>
4-运行时数据区
方法区<br>
堆
old区
young区
Survivor (s0+s1 或者From+To)<br>
Eden
堆上对象生命过程<br>
虚拟机栈
栈<br>
通过堆栈指针移动进行快速有效的分配存储,仅次于寄存器<br>
存在栈中的数据大小和生命周期必须是确定的
栈数据可以在栈内共享(字面值引用)
栈桢
局部变量表<br>
操作数栈<br>
动态链接
方法出口
本地方法栈
程序计数器
其他补充
栈指向堆
局部变量 Object obj=new Object()<br>
方法区指向堆<br>
静态变量 private static Object obj=new Object()<br>
堆指向方法区
java对象头中的Class Pointer<br>
Java对象内存布局
对象头
Mark Word<br>
8字节
Class Pointer<br>
8字节
Length:数组对象特有
4字节
实例数据:包含了对象的所有成员变量
大小由变量类型决定<br>
对其补充
为了保证对象的大小为8字节的整数倍
内存溢出
堆内存溢出
方法区内存溢出
栈溢出
0 条评论
下一页