GC测试
基于SpringBoot来开发接口并编译运行
代码
UserController类
package com.wjq.demo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.LinkedList;
import java.util.List;
@RestController
public class UserController {
@RequestMapping("/user")
public void getUser() {
List<User> list = new LinkedList<>();
// 堆上分配100M
for (int i = 0; i < 100; i++) {
list.add(new User());
}
// 延迟1s
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
User类
package com.wjq.demo;
public class User {
private String s = new String(new byte[1024 * 1024]);
}
生成jar包并运行
java -jar demo-0.0.1-SNAPSHOT.jar
GC分析
触发GC
# 安装ab命令
yum install -y httpd-tools
# 发送10万次请求,每次请求大概消耗100M内存
ab -n 100000 http://localhost:8080/user
常用命令
# 打印所有的参数列表
java -XX:+PrintFlagsInitial
# 打印堆栈信息
jstack pid
# 打印进程的启动参数和JVM参数
jinfo pid
# 查找占用内存多的大对象
jmap -histo pid | head -n 20
详细分析
打印不同分代的内存使用情况
每次间隔1s,查看1万次,8371是Java进程id
jstat -gc 8371 1000 10000
S0C:新生代中第1个survivor的容量
S1C:新生代中第2个survivor的容量
S0U:新生代中第1个survivor已使用空间
S1U:新生代中第2个survivor已使用空间
EC:新生代中Eden的容量
EU:新生代中Eden已使用空间
OC:老年代的容量
OU:老年代已使用空间
MC:方法区容量
MU:方法区已使用空间
CCSC:压缩类容量
CCSU:压缩类已使用空间
YGC:新生代中gc次数
YGCT:新生代中gc时间
FGC:老年代gc次数
FGCT:老年代gc时间
GCT:gc总时间
空间单位是kb,时间单位是秒。