一、JVM类加载机制——自定义类加载器
二、JVM——对象内存分配机制
三、JVM内存模型
四、JVM垃圾收集算法和垃圾收集器
五、CMS垃圾回收器——三色标记算法
六、G1垃圾收集器
七、JVM调优实战——基本命令使用
八、JVM调优实战——arthas使用
九、大流量电商系统JVM调优案例
1、jmap -histo 7256 > ./log.txt
查看内存信息,存入log.txt中。
instances:对象实例数;
bytes:占用的内存大小;
class name:类名
2、jmap -heap id 查看进程的堆信息
macbook不支持jdk1.8下的该命令。
3、jamp -dump:format=b,file=test.hprof id
生产环境中设置堆溢出时,自动生成dump文件
-XX:+HeapDumpOnOutOfMemoryError
-XX:+HeapDumpPath=./ (生成dump文件的存储目录)
可以使用jvisualvm分析dump文件。
1、jstack pid查看进程死锁
线程名:“Attach Listener”
deamon:守护线程
prio:线程优先级
os_prio:操作系统中线程的优先级
tid:线程id
nid:线程对应的本地线程标识id
waiting:线程状态
如果有死锁会看到“blocked”状态
还可以使用jvisualvm检测死锁,jvisualvm支持远程连接。
2、jstack 找出占用cpu最高的线程堆栈信息
(1)top -pid 7495,显示你的java进程的内存情况。
(2)然后按“H”,获取每个线程的内存情况。
(3)找到内存和cpu占用最高的线程id,比如19664;
(4)把199664转为十六进制的0x4cd0,这就是线程的十六进制表示。
(5)执行jstack pid | grep -A 10 4cd0,得到这个线程所在的行后面10行,从堆栈中可以发现导致cpu变高的方法。
(6)然后对着源码,排查问题。
1、jinfo -flags pid 查看jvm参数
2、jinfo -sysprops pid 查看java系统参数
五、jstat 查看堆内存各部分的使用情况,以及加载类的数量。1、jstat -gc pid 查看垃圾回收情况
jstat -gc pid 1000 10 每个1s,看一下垃圾回收情况,执行10次。可以用于计算垃圾回收模型。