• Java生成堆内存dump


    在处理压力测试问题的时候,经常遇到OOM的情况,这时候我们需要去记录内存实时的情况,一般会打出一个dump文件,而后再使用MAT等内存分析工具去查看哪些对象一直占用了大量内存,最终分析出代码需要优化的地方。

    那么java如何打出dump文件呢?

    java提供了jmap命令,如下:

    jmap -dump:format=b,file=/path/heap.bin 进程ID
    jmap -dump:live,format=b,file=/path/heap.bin 进程ID
    live参数:

    表示我们需要抓取目前在生命周期内的内存对象,也就是说GC收不走的对象,然后我们绝大部分情况下,需要的看的就是这些内存。而且会减小dump文件的大小。

    在命令行下可以直接运行,当然使用java也可以按指定方式执行,示例如下:

    package com.szh;

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Scanner;
    import java.util.concurrent.TimeUnit;

    public class TestDump {
    public static void main(String[] args) throws InterruptedException, IOException {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
    Runtime runtime = Runtime.getRuntime();

    Scanner scanner = new Scanner(System.in);
    System.out.println("请输入java进程PID:");
    int pID = scanner.nextInt();
    System.out.println("请输入dump文件输出路径:");
    String dumpPath = scanner.next();
    scanner.close();

    if (!dumpPath.endsWith(File.separator)) {
    dumpPath = dumpPath + File.separator;
    }
    String cmd = "jmap -dump,format=b,file=" + dumpPath + "_" + sdf.format(new Date()) + ".bin " + pID;
    runtime.exec(cmd);
    TimeUnit.SECONDS.sleep(5L);

    while (true) {
    cmd = "jmap -dump:live,format=b,file=" + dumpPath + "_" + sdf.format(new Date()) + ".bin " + pID;
    Process process = runtime.exec(cmd);
    /*InputStreamReader isr = new InputStreamReader(process.getInputStream(), "GBK");
    BufferedReader br = new BufferedReader(isr);
    while (true) {
    String str = br.readLine();
    if (str == null) {
    break;
    }
    System.out.println(str);
    }*/
    TimeUnit.HOURS.sleep(1L);
    }
    }
    }
     
    ————————————————
    原文链接:https://blog.csdn.net/songzehao/article/details/84575834

  • 相关阅读:
    java入门经验分享——记面向对象先导课程学习感想
    HashCode方法整理
    Java中vector用法整理
    Java中Iterator用法整理
    org.springframework.data.redis.RedisConnectionFailureException
    dubbo服务启动正常,但是访问不到服务,在监测中心也找不服务的原因之一
    【转】Elasticsearch Java Rest Client 指南
    【转】mybatis根据mapper执行sql的过程
    转:IDEA异常解决: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
    ES的常用查询与聚合
  • 原文地址:https://www.cnblogs.com/xd502djj/p/12176568.html
Copyright © 2020-2023  润新知