JVM知识地图
2021-03-11 21:51:25 12 举报
AI智能生成
JVM知识地图
作者其他创作
大纲/内容
调优
性能指标
吞吐量
停顿时间
垃圾回收频率
工具
命令
jps
jmap
查看内存信息,实例个数以及占用内存大小
jmap -histo pid
jmap -heap pid
jmap ‐dump:format=b,file=filename.hprof pid
jstack
jinfo
jstat
jstat -gc pid
jstat -options
arthas
gcviewer
MAT
gceasy
https://gceasy.io
参数
-XX:Xms
-XX:Xmx
-XX:Xmn
-XX:Xss
-XX:MaxMetaspaceSize
-XX:MaxMetaspaceSizeMetaspaceSize
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath
方法
查看&分析 GC日志
-XX:+PrintGC 输出GC日志
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-Xloggc:../logs/gc.log 日志文件的输出路径
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-Xloggc:../logs/gc.log 日志文件的输出路径
1. 降低 Minor GC 频率
2. 降低 Full GC 的频率
减少创建大对象
增大堆内存空间
选择合适的 GC 回收器
JVM 内存分配的调优
AB压测
分析GC日志
实践
内存持续上升,如何排查问题?
top
top -Hp pid
vmstat
内存
pidstat
线程
pidstat -p pid -r
cpu使用率过高和jvm old占用过高排查过程
cpu占用过高排查思路
top 查看占用cpu的进程 pid
top -Hp pid 查看进程中占用cpu过高的线程id tid
printf '%x/n' tid 转化为十六进制
jstack pid |grep tid的十六进制 -A 30 查看堆栈信息定位
top -Hp pid 查看进程中占用cpu过高的线程id tid
printf '%x/n' tid 转化为十六进制
jstack pid |grep tid的十六进制 -A 30 查看堆栈信息定位
jvm old区占用过高排查思路
top查看占用cpu高的进程
jstat -gcutil pid 时间间隔 查看gc状况
jmap -dump:format=b,file=name.dump pid 导出dump文件
用visualVM分析dump文件
jstat -gcutil pid 时间间隔 查看gc状况
jmap -dump:format=b,file=name.dump pid 导出dump文件
用visualVM分析dump文件
GC
可回收对象判断
引用计数
可达性分析
对象引用类型
强引用
软引用
弱引用
虚引用
GC算法
分代收集理论
标记-清除
复制
标记-整理
底层算法
三色标记
黑色
灰色
白色
读屏障
写屏障
SATB
Snapshot At The Beginning
增量更新
垃圾回收器
年轻代
Serial
Parallel
ParNew
Epsilon
老年代
Serial Old
Parallel Old
CMS
G1
Region
最大2048
Humongous
特点
并行与并发
分代算法
空间整合
可预测的停顿
GC
YoungGC
MixedGC
FullGC
ZGC
Shennandoah
选择
1. 优先调整堆的大小让服务器自己来选择
2. 如果内存小于100M,使用串行收集器
3. 如果是单核,并且没有停顿时间的要求,串行或JVM自己选择
4. 如果允许停顿时间超过1秒,选择并行或者JVM自己选
5. 如果响应时间最重要,并且不能超过1秒,使用并发收集器
6. 4G以下可以用parallel,4-8G可以用ParNew+CMS,8G以上可以用G1,几百G以上用ZGC
2. 如果内存小于100M,使用串行收集器
3. 如果是单核,并且没有停顿时间的要求,串行或JVM自己选择
4. 如果允许停顿时间超过1秒,选择并行或者JVM自己选
5. 如果响应时间最重要,并且不能超过1秒,使用并发收集器
6. 4G以下可以用parallel,4-8G可以用ParNew+CMS,8G以上可以用G1,几百G以上用ZGC
内存分配
对象创建过程
类加载检查
分配内存
方法
指针碰撞
空闲列表
并发
CAS
TLAB
本地线程分配缓冲
初始化
初始化为零值
设置对象头
执行<init>方法
属性赋值
构造方法
指针压缩
分配过程
栈上分配
逃逸分析
标量替换
堆上分配
Eden区
长期存活进入老年代
默认15,CMS6
对象动态年龄判断
S0<->S1
大对象进入老年代
PretenureSizeThreshold
老年代空间分配担保机制
-HandlePromotionFailure
堆外内存分配
DirectByteBuffer
使用ByteBuffer.allocateDirect()
内存结构
堆
Young 1/3
Eden 8/10
Survivor
From 1/10
To 1/10
Old 2/3
栈
虚拟机栈
栈帧
局部变量表
操作数栈
动态链接
方法出口
main() 栈帧
本地方法栈
程序计数器
方法区/元空间
常量池
堆外内存
字节码执行引擎
类加载
过程
加载
连接
验证
准备
静态变量
默认值
解析
静态链接
符号引用->直接引用
初始化 <cinit>
静态变量初始化
静态代码块
使用
卸载
类加载器
bootstrap
ext
app
custom
双亲委派
先找父亲加载,不行再由儿子自己加载
原因
沙箱安全
避免重复加载
打破双亲委派
自定义
Tomcat
1)Class.forName()除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块,还会执行给静态变量赋值的静态方法。
2)classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块
2)classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块
字节码
魔数
版本号
常量池
字段表集合
方法表集合
编译
JIT
HotSpot
C1
client
C2
server
热点探测
方法调用计数器
回边计数器
编译优化
方法内联
栈上分配
标量替换
锁消除
Graal
java10
静态编译
javac
*.class
编译原理
词法分析
语法分析
AST: 抽象语法树
语义分析
代码生成
+: 代数->组合数学、离散数学、图论->形式语言与自动机
产品
HotSpot
收藏
收藏
0 条评论
下一页