文档查看地址 https://docs.oracle.com/javase/8/docs/technotes/tools/unix/toc.html
图片.png
默认 java -version 为混合模式
图片.png
图片.png
图片.png
图片.png
-
查看当前进程堆最大空间
jinfo -flag MaxHeapSize 进程id
图片.png -
jinfo -flag ThreadStackSize 进程id (调优时会把该值改小,改为512k)
图片.png
图片.png
java -XX:+PrintFlagsFinal -version > flags.txt
sz flags.txt 将文件拿到本地
-
查看进程
jps 、jps -l
图片.png
图片.png 查询当前进程被手动赋值的信息
jinfo -flags 进程id
jstat查看JVM统计信息
- 类装载
- 垃圾收集
- JIT编译
图片.png
Loaded加载的类的个数 bytes 占用的字节数 unloaded 卸载的类的个数 times花费的时间
-
gc信息查看
jstat -gc 1759 1000 10
图片.png
图片.png
非堆区是指操作系统的本地内存,独立于堆区之外的。
图片.png
jmap +MAT实战内存溢出
start.spring.io
-Xmx32M -Xms32M 设置最大内存和最小内存
package com.alan.springbootdemo3.controller;
import com.alan.springbootdemo3.entity.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
//相当于@Controller 和@ResponseBody两个注解的组合
@RestController
public class MemoryCcontroller {
private List<User> users = new ArrayList<>();
/**
* -Xmx32M -Xms32M 设置最大内存和最小内存
* @return
*/
@GetMapping("/heap")
public String heap(){
int i = 0;
while (true){
users.add(new User(i++, UUID.randomUUID().toString()));
}
}
}
导出内存映像文件
图片.png
jmap -dump:format=b,file=heap.hprof 进程id
通过MAT工具分析内存溢出
图片.png
图片.png
jstack实战死循环和死锁
jstack 进程id
配合top查看cpu 情况 根据堆栈信息找到有问题的方法
- 定位死锁
/**
* 死锁
* */
@RequestMapping("/deadlock")
public String deadlock(){
new Thread(()->{
synchronized(lock1) {
try {Thread.sleep(1000);}catch(Exception e) {}
synchronized(lock2) {
System.out.println("Thread1 over");
}
}
}) .start();
new Thread(()->{
synchronized(lock2) {
try {Thread.sleep(1000);}catch(Exception e) {}
synchronized(lock1) {
System.out.println("Thread2 over");
}
}
}) .start();
return "deadlock";
}
- jstack日志中错误信息
com.alan.springbootdemo3.chapter2.CpuController.lambda$deadlock$0(CpuController.java:33)
- waiting to lock <0x0000000744ad3408> (a java.lang.Object)
- locked <0x0000000744ad33f8> (a java.lang.Object)
at com.alan.springbootdemo3.chapter2.CpuController$$Lambda$148/1545477220.run(Unknown Source)
at java.lang.Thread.run(java.base@10.0.2/Thread.java:844)
"Thread-4":
at com.alan.springbootdemo3.chapter2.CpuController.lambda$deadlock$1(CpuController.java:41)
- waiting to lock <0x0000000744ad33f8> (a java.lang.Object)
- locked <0x0000000744ad3408> (a java.lang.Object)
at com.alan.springbootdemo3.chapter2.CpuController$$Lambda$149/1478591295.run(Unknown Source)
at java.lang.Thread.run(java.base@10.0.2/Thread.java:844)
Found 1 deadlock.