美文网首页
基于JDK命令行工具的监控以及实战Java内存溢出

基于JDK命令行工具的监控以及实战Java内存溢出

作者: 宁静的猫 | 来源:发表于2019-09-30 11:35 被阅读0次

1、JVM参数类型

JVM包括3种参数类型,标准类型,X参数类型和XX参数类型。

标准参数: -help  -version 
X参数类型:  -Xint(解释执行) -Xcomp(第一次使用就编译成本地代码)
XX参数类型:  -XX:+UseG1GC  -Xmx(最大堆内存)  -Xms(最小堆内存)

2、查看JVM运行时参数

介绍以下几个Java命令:jps、jinfo、jstat

jps命令:查看Java进程

jinfo命令:
    1、jinfo -flag MaxHeapSize [pid] //查看对应pid的最大内存
    2、jinfo -flags [pid]//查看所有运行时参数

jstat命令(类装载,垃圾收集,JIT编译):
    1、jstat -class [pid] [时间间隔(ms)] [次数]//查看类装载信息
    2、jstat -gc [pid] [时间间隔(ms)] [次数]//查看垃圾回收信息

3、实战内存溢出

1、编写测试代码

public class TestOOM {
    
    static class OOMObject{
    }

    public static void main(String[] args) {
        List<OOMObject> oomObjectList = new ArrayList<>();
        while (true){
            oomObjectList.add(new OOMObject());
        }
    }
    
}

2、在IDEA中配置JVM参数,设置最大最小内存,设置当发生OOM时生成HeapDump,设置HeapDump生成文件的路径,参数如下

-Xmx32M -Xms32M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./
IDEA配置

当在运行时就想导出HeapDump时,可以使用jmap命令,如下:

jmap -dump:format=b,file=heap.hprof 24120

format=b 表示导出二进制文件
file=heap.hprof 表示导出二进制文件的文件名
24120 是进程的id

3、运行代码发生OOM后,或者导出HeapDump后,即可在项目文件加下生成一个*.hprof的文件

4、使用MAT分析导出的文件,先在https://www.eclipse.org/mat/downloads.php下载MAT软件,打开*.hprof文件

MAT打开HeapDump
可以看出,MAT已经帮我们推断出,可能是内存泄漏引起的OOM。

点击Histogram


Histogram

我们可以通过MAT的Histogram功能分析内存中对象的个数。从图中可以看出,Student对象个数达到了777535个。

通过这个,我们可以轻易的推断出程序里有问题的地方。

相关文章

网友评论

      本文标题:基于JDK命令行工具的监控以及实战Java内存溢出

      本文链接:https://www.haomeiwen.com/subject/hymructx.html