JVM调优

1、使用MAT查看服务是因为什么代码导致的停服(例如OOM)

不太好验证,写了一个死循环放在接口里,然后调用接口3次,机器直接挂掉了,没有任何的hprof文件产生

JVM调优_第1张图片

调用接口

JVM调优_第2张图片

机器直接挂了。但是没有看到hprof文件,

JVM调优_第3张图片

这样怎么办呢,才能验证我的这个学习需求呢? 

这段代码不太适合验证OOM,只是频繁往磁盘记录log造成IO交互频率高,CPU倒是挺高的,但是内存一直涨不上去。

所以换用如下代码:

private static final Integer K = 1024;
    /**
     * 死循环,验证JVM调优
     * @return
     */
    @GetMapping(value = "/deadLoop")
    public void deadLoop(){
        int size = K * K * 8;
        List list = new ArrayList<>();
        for (int i = 0; i < K; i++) {
            log.info("deadLoop"+i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            list.add(new byte[size]);
        }

    }

往内存中写入大字节内容,内存就会溢出。

调用接口,发现没生成hprof文件,网上招了办法,启动脚本startup.sh需要这样改:

nohup java -jar -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/lighthouse/hmblogs hmblogs.jar >nohup.log 2>&1 &

开启内存泄漏时输出堆栈信息:

-XX:+HeapDumpOnOutOfMemoryError

指定堆栈信息输出的路径:

-XX:HeapDumpPath=/home/tempadmin/hwzt-third-party

调用接口后,查看生成了hprof文件,800多M的文件:

JVM调优_第4张图片

你可能感兴趣的:(JAVA,java)