zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    SQL基础-子查询&EXISTS&UNION
    SQL基础-汇总统计及GROUP BY
    SQL基础-创建新的输出字段
    SQL基础-过滤数据
    获取图片为二进制流,并且显示图片到网页
    计算两个日期相差的工作小时数,过滤了周末双休小时数
    计算两个日期相差的工作天数,过滤了周末双休天数
    WEB性能测试工具
    C#整合VS2010和NUnit
    如何打开Windows Server 2008 R2的域安全策略
  • 原文地址:https://www.cnblogs.com/xd502djj/p/12176568.html
Copyright © 2011-2022 走看看