使用JProfiler分析java程序OOM问题

JProfiler简介

JProfiler 是一个商业的主要用于检查和跟踪系统(限于Java开发的)的性能的工具。JProfiler可以通过时时的监控系统的内存使用情况,随时监视垃圾回收,线程运行状况等手段,从而很好的监视JVM运行情况及其性能。

JProfiler 是一个全功能的Java剖析工具(profiler),专用于分析J2SE和J2EE应用程序。它把CPU、执行绪和内存的剖析组合在一个强大的应用中。 JProfiler可提供许多IDE整合和应用服务器整合用途。JProfiler直觉式的GUI让你可以找到效能瓶颈、抓出内存漏失(memory leaks)、并解决执行绪的问题。它让你得以对heap walker作资源回收器的root analysis,可以轻易找出内存漏失;heap快照(snapshot)模式让未被参照(reference)的对象、稍微被参照的对象、或在终结(finalization)队列的对象都会被移除;整合精灵以便剖析浏览器的Java外挂功能。

下载地址ej-technologies - Java APM, Java Profiler, Java Installer Builder

如果是在开发的过程中联调的话,可以在编辑器比如Ecplise或者IDEA安装JProfiler插件。

模拟OOM

这里为了简易实现OOM,在IDEA的jvm里面配置了当前程序运行的JVM参数

 

 配置初始的堆大小为10m,最大的堆大小为20m

-Xms10m -Xmx20m

 在配置了-XX:+PrintGCDetails,从哪打印的日志可以看出,堆内存的配置已经生效。

初始内存:9961472字节    ,9728.0K    9.5M
最大内存:18874368字节    ,18432.0K    18.0M

模拟OOM简单代码

   byte[] array = new byte[1*1024*1024];

    public static void main(String[] args){
          ArrayList<Test> list = new ArrayList<Test>();
        int count = 0;
        try{
            while(true){
                list.add(new Test());
                count++;
            }
        }catch (Error e){
            System.out.println(count);
            e.printStackTrace();
        } 
    }

直接点击运行后,会报如下错误:

java.lang.OutOfMemoryError: Java heap space
    at Test.<init>(Test.java:26)
    at Test.main(Test.java:33)

 对于简单的程序,日志较少的,可以直接在控制台日志定位到代码的位置,对于复杂的程序可以借助JProfiler来分析。

开发环境中可在idea中添加vm参数-XX:+HeapDumpOnOutOfMemoryError,将发生有OOM异常时的文件dump下来,一般是.hprof后缀的文件,用JProfiler打开即可查看产生异常的原因。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值