一、JVM跨平台、跨语言特性
- JVM根据不同操作系统生成对应的机器码
- 不同的语言编译后生成字节码文件,JVM只处理字节码文件。
二、JVM解释执行、JIT
三、对象创建
Mark Word结构
四、垃圾标记算法
五、垃圾回收算法
六、垃圾回收器
- STW:会暂停业务线程;
- 安全点:GC期间,会对象引用的一行代码,会在最近的一个安全点挂起当前业务线程;
- 安全区域:GC期间,不会改变对象引用的代码可以继续执行,这个代码区间就是安全区域。
七、分代模型
触发GC的条件:
- Young GC:Eden区满了
- Full GC:调System.gc()、老年代空间不足、永久代(方法区)空间不足、分配担保机制(新生代存储不下存活的对象,就会转交给老年代存储,如果老年代也存储不下,则触发)、存储CMS的浮动垃圾空间不足。
八、内存溢出、内存泄漏
内存溢出(OOM)
- 导致OOM
栈溢出、堆溢出、方法区溢出、本机直接内存溢出 - 定位OOM
通过-XX:+HeapDumpOnOutOfMemoryError
设置发生OOM时,dump堆内存信息;
dump堆内存信息存放目录通过-XX:+HeapDumpPath=路径
设置;
使用JVM自带的VisualVM工具查看dump日志。
内存泄漏
无用的对象持续占据内存,无法释放内存。
常见问题排查
1、系统TR变长排查思路
- 请求量飙升,导致某个中间件资源不足
MySQL
Redis
RocketMQ - 请求量飙升,导致下游系统扛不住
- CPU飙升
2、CPU飙升的排查思路
- 请求量飙升,导致资源不足,扩容。
- CPU上下文切换频繁。文件IO、网络IO、锁等待;
- top命令查看占用CPU较多的线程。一直为同一线程,说明存在长期未释放CPU的情况,通过
jstack
dump出文件具体看;线程频繁变化,说明创建对象频繁。
JVM启动参数命令
JVM排查问题常用命令
-
JPS
从操作系统的临时目录(可能信息不全)查找当前机器运行的虚拟机进程。
-q:显示进程
-m:输出主函数传入的参数
-l:主类的完整package名称或jar完整名称
-v:列出JVM参数 -
jstat
监控虚拟机运行状态信息。
jstat -gc 进程ID:实时查看
jstat -gc 100 10:每间隔100毫秒查询10次 -
jinfo
查看和修改虚拟机参数。
jinfo -sysprops:查看System.getProperities()获取的参数
jinfo -flag:未被显示制定的参数的系统默认值
jinfo -flags:显示虚拟机的参数 -
jmap
生成堆转储快照(即dump文件)。
jmap -heap : 打印heap的概要信息
jmap -dump:生成dump文件 -
jstack
生成虚拟机当前时刻的线程快照。 -
jvisualvm
可视化工具,分析dump文件