JVM —— 内存泄漏判断(JProfiler)

文章目录

  • JVM —— 内存泄漏判断(JProfiler)
    • 基本定义
    • JProfiler安装
    • IDEA插件 JProfiler
    • 实战
      • 模拟内存泄漏
      • 修改JVM启动项
        • 启动项
      • 启动程序(非JProfiler)
    • 总结

JVM —— 内存泄漏判断(JProfiler)

通过JProfiler来分析内存泄漏(OOM)问题

基本定义

  • 维基百科
    JProfiler is a commercially licensed Java profiling tool developed by ej-technologies GmbH, targeted at Java EE and Java SE applications.
  • 百度百科
    JProfiler 是一个商业授权的Java剖析工具,由EJ技术有限公司,针对的Java EE和Java SE应用程序开发的。

JProfiler安装

  • 官方下载
    使用9.2版本,可破解,最新的10.+在尝试的时候没有找到破解码
    官方下载地址 V9.2 :https://www.ej-technologies.com/download/jprofiler/version_92
    JVM —— 内存泄漏判断(JProfiler)_第1张图片
  • 安装并录入破解码
    按默认选择“Single or evaluation license” ,Name 和 Company 随意填!!!
JProfiler 9.2  注册码  
L-Larry_Lau@163.com#23874-hrwpdp1sh1wrn#0620 
L-Larry_Lau@163.com#36573-fdkscp15axjj6#25257 
L-Larry_Lau@163.com#5481-ucjn4a16rvd98#6038 
L-Larry_Lau@163.com#99016-hli5ay1ylizjj#27215 
L-Larry_Lau@163.com#40775-3wle0g1uin5c1#0674 
L-Larry_Lau@163.com#7009-14frku31ynzpfr#20176 
L-Larry_Lau@163.com#49604-1jfe58we9gyb6#5814 
L-Larry_Lau@163.com#25531-1qcev4yintqkj#23927 
L-Larry_Lau@163.com#96496-1qsu1lb1jz7g8w#23479 
L-Larry_Lau@163.com#20948-11amlvg181cw0p#171159 

至此,分析工具安装完毕,因为我是用IDEA开发的,有一个插件,可以让IDEA可以通过JProfiler启动,进而监测程序情况。

IDEA插件 JProfiler

  • Plugins搜索
    JVM —— 内存泄漏判断(JProfiler)_第2张图片
  • JProfiler
    JVM —— 内存泄漏判断(JProfiler)_第3张图片
  • 安装之后,重启IDEA,右键程序启动项,可通过Profiler启动
    JVM —— 内存泄漏判断(JProfiler)_第4张图片
  • 这时,会自动打开JProfiler
    JVM —— 内存泄漏判断(JProfiler)_第5张图片

实战

准备工作做好了,我们如何分析内存泄漏(OOM)问题呢?

模拟内存泄漏

  • 创建实体Bean
public class VmVO implements Serializable {

    private static final long serialVersionUID = 7662305686639833768L;

    private String vmId;

    private String vmCode;

    private String vmName;

    public String getVmId() {
        return vmId;
    }

    public void setVmId(String vmId) {
        this.vmId = vmId;
    }

    public String getVmCode() {
        return vmCode;
    }

    public void setVmCode(String vmCode) {
        this.vmCode = vmCode;
    }

    public String getVmName() {
        return vmName;
    }

    public void setVmName(String vmName) {
        this.vmName = vmName;
    }

    public VmVO() {
    }

    public VmVO(String vmId, String vmCode, String vmName) {
        this.vmId = vmId;
        this.vmCode = vmCode;
        this.vmName = vmName;
    }
}
  • 创建Main方法,不断的new实体Bean,并放入List
public class StartConfig {
    public static VmVO outOf(int i) {
        VmVO vmVO = new VmVO();
        vmVO.setVmId(UUID.randomUUID().toString().replaceAll("-", ""));
        vmVO.setVmCode(i+"");
        vmVO.setVmName("frank_" + i);
        return vmVO;
    }

    public static void main(String[] args) {
        List arrayList = new ArrayList();
        for(int i=0; true; i++) {
            arrayList.add(outOf(i));
        }
    }
}

修改JVM启动项

这步很关键,启动项配置了,当内存溢出时会生成一个报告到指定的位置,这个报告是.hprof文件

启动项
-server -Xmx64m -Xms64m -Xmn32m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/WORK/Project_Java/spring-jvm
  • -XX:+HeapDumpOnOutOfMemoryError
    指定发生内存溢出输出文件
  • -XX:HeapDumpPath=
    指定文件输出位置

启动项可参考这篇博客《https://blog.csdn.net/Cy_LightBule/article/details/88555638》

启动程序(非JProfiler)

直接启动,等待内存溢出,程序GG

  • 启动(两者均可)
    JVM —— 内存泄漏判断(JProfiler)_第6张图片
  • 然后过一会,程序就GG了,控制台输出:
    JVM —— 内存泄漏判断(JProfiler)_第7张图片
    这里要注意Dumping heap to /WORK/Project_Java/spring-jvm/java_pid62159.hprof 这句话/WORK/Project_Java/spring-jvm/是我们在启动项配置的输出地址,我们到这个位置把文件“java_pid62159.hprof ”在JProfiler打开:
    JVM —— 内存泄漏判断(JProfiler)_第8张图片
    进而来分析内存溢出原因。

总结

上述描述了一种如何在开发环境下排查内存溢出和如何在开发环境下监控您的服务,在实际投产中,我们可以默认启动项配置.hprof,当发生问题时,借助监控平台获知问题服务,通过运维获取.hprof文件在JProfiler进行分析。

你可能感兴趣的:(技术总结,Java,弗兰克与Java,JVM,内存泄漏,JVM内存泄漏定位)