首页 > 技术文章 > JVM随笔记录8-jvm调优工具说明

hxwhero 2020-10-19 09:01 原文

  本节主要记录下JVM调优中需要使用到的一些命令和工具,堆中内存配置如下:

  -Xms20M -Xmx20M -Xmn10M -XX:MetaspaceSize=1M -XX:MaxMetaspaceSize=1M -Xss225KB

  使用下面这个代码,分别使用命令来看下堆的使用情况,这里使用的是window系统来示范

public class JvmTest {

    public static void main(String[] args) throws InterruptedException {
        List<entity> list = new ArrayList<>();
        for (int i = 0; i < 10000; i++){
            list.add(new entity(new byte[1024]));
        }
        Thread.sleep(60 * 60 * 1000);
    }

    static class entity{
        byte[] a;

        public entity(byte[] a){
            this.a = a;
        }
    }
}

jstat命令

  使用Jps命令查看运行程序的PID

 

 这里可以看到运行的 JvmTest的PID是21676。接下来使用jstat -gc 21676 查看堆中内存分布情况

 

 S0C和S1C表示两个survivor去分别占用1M内存,S0U和S1U表示两个survivor去内存使用情况,这里两个survivor区使用内存为0

EC表示eden去总内存是8M,EU表示eden去已使用内存,这里可以看到已使用6M

OC表示老年代总内存,OU表示老年代已使用内存,MC是元空间可用,MU是元空间已用。CCSC:当前压缩类空间的容量  CCSU:当前压缩类空间目前已使用空间 

YGC:young gc的次数,YGCT:young gc的总耗时 ,FGC:full gc的次数,FGCT:full gc的总耗时,GCT:所有GC的累计总耗时

这个是jstat最实用的命令,可以看到堆中个内存的分布已经GC的情况,通过 jstat -gc 21676 1000 10 命令可以每秒钟更新出最新一次的jstat统计数据,累计执行10次

jmap命令

  实用 jmap -histo PID  可以打印出各种对象内存空间大小情况

 

 还可以实用jmap来生成堆内存转储快照: jmap -dump:live,format=b,file=dump.hprof PID

 

 接下来实用mat工具可以分析dump.hprof快照数据,mat下载路径:http://www.eclipse.org/mat/downloads.php

mat默认给出的启动内存是1024M,如果快照中数据比这个大,需要调整mat的MemoryAnalyzer.ini配置文件中对应的大小

 

接着启动mat,选择open a head dump,然后选择之前生成的快照文件 

 

 

之后选择Leak Suspects Report,表示进行内存泄漏的分析

 

 然后就可以看到如下:

 

 从上图就可以很清晰的看出可能存在内存泄漏的问题“problem suspect 1”,查看数据详情可以点击最后的details,如果是追踪线程执行堆栈,可以点击SEE stacktrace。

 

推荐阅读