一、JVM类加载机制——自定义类加载器
二、JVM——对象内存分配机制
三、JVM内存模型
四、JVM垃圾收集算法和垃圾收集器
五、CMS垃圾回收器——三色标记算法
六、G1垃圾收集器
七、JVM调优实战——基本命令使用
八、JVM调优实战——arthas使用
九、大流量电商系统JVM调优案例

一、JPS查看进程id

七、JVM调优实战——基本命令使用_jstack

二、Jmap 可以查看内存信息,实例个数以及占用内存

1、jmap -histo 7256 > ./log.txt

查看内存信息,存入log.txt中。
七、JVM调优实战——基本命令使用_jmap_02
instances:对象实例数;
bytes:占用的内存大小;
class name:类名

2、jmap -heap id 查看进程的堆信息

七、JVM调优实战——基本命令使用_jstat_03
macbook不支持jdk1.8下的该命令。

3、jamp -dump:format=b,file=test.hprof id

生产环境中设置堆溢出时,自动生成dump文件
-XX:+HeapDumpOnOutOfMemoryError
-XX:+HeapDumpPath=./ (生成dump文件的存储目录)
七、JVM调优实战——基本命令使用_调优_04

可以使用jvisualvm分析dump文件。
七、JVM调优实战——基本命令使用_jstat_05

三、jstack

1、jstack pid查看进程死锁

七、JVM调优实战——基本命令使用_jstat_06
线程名:“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)然后对着源码,排查问题。

四、jinfo 查看java应用程序的扩展参数

1、jinfo -flags pid 查看jvm参数

七、JVM调优实战——基本命令使用_jstack_07

2、jinfo -sysprops pid 查看java系统参数

五、jstat 查看堆内存各部分的使用情况,以及加载类的数量。

1、jstat -gc pid 查看垃圾回收情况

jstat -gc pid 1000 10 每个1s,看一下垃圾回收情况,执行10次。可以用于计算垃圾回收模型。
七、JVM调优实战——基本命令使用_调优_08

2、jstat -gccapacity 7574 堆内存统计

七、JVM调优实战——基本命令使用_调优_09

3、jstat -gcnew 7574 新生代垃圾回收统计

七、JVM调优实战——基本命令使用_jstack_10

4、jstat -gcnewcapacity 7574 新生代内存统计

七、JVM调优实战——基本命令使用_jstat_11

5、jstat -gcold 7574 老年代垃圾回收统计

七、JVM调优实战——基本命令使用_JVM_12

6、jstat -gcoldcapacity 7574 老年代内存统计

七、JVM调优实战——基本命令使用_调优_13

7、jstat -gcmetacapacity 7574 元空间统计

七、JVM调优实战——基本命令使用_调优_14