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,时间单位是秒。

posted on 2022-12-17 14:37  王景迁  阅读(125)  评论(0编辑  收藏  举报

导航