转载

每日一博 | 关于 jvm 分析的指令及 jprofiler 初体验

介绍:

初步学习了一下linux相关获取jvm运行情况以及内存的对象状况的和获取dump文件的命令,以及利用jprofiler打开dump文件,利用jprofiler启动项目实时监控内存。但是只是模拟了一下,实际运用场景还是有待说明,感觉主要靠经验。

第一点,top命令

top命令先查出 占用cpu最高或者内存最高的java进程

每日一博 | 关于 jvm 分析的指令及 jprofiler 初体验

这里可以看出pid为2142的java进程的cpu占用率以及 只用内存比较大

第二点,jmap -heap 2142

针对这个进程id显示他的内存信息  和配置信息

每日一博 | 关于 jvm 分析的指令及 jprofiler 初体验

这里看出对内存的配置信息   以及下面的对内存的使用情况  包括eden区  拷贝的from  以及to区  以及

ps old 年老代  这些的使用情况  结合fullgc的周期性 和大小  younggc  可以分析项目的健康状况

可以适当优化jvm参数  不过一般不需要 都是代码的问题

第三点, jmap -histo 2142

显示对象的实例的个数 以及所占字节的图表

每日一博 | 关于 jvm 分析的指令及 jprofiler 初体验

这里看出哪些对象的实例特别多 方便查询问题

第四点, jmap -dump:live,format=b,file=2.log 2142

生成dump文件

每日一博 | 关于 jvm 分析的指令及 jprofiler 初体验

生成dump文件的过程

第五点,利用jprofiler打开dump文件

每日一博 | 关于 jvm 分析的指令及 jprofiler 初体验

预览效果dump文件打开的效果

第六点,利用jprofiler实时监控项目运行情况 并模拟内存溢出的状况

每日一博 | 关于 jvm 分析的指令及 jprofiler 初体验

利用jprofiler idea安装jprofiler的插件  启动之后 实时监控  内存 ,gc的频率, 对象的生成

线程的比例  有记录到线程的具体的 是否阻塞 多少阻塞 等 以及cpu使用率 的一系列图表 另外观察内存 还可以具体切换观察到eden  psold 和整个heap区域的实际情况

模拟代码

@RequestMapping(value = "/test.rest")
@ResponseBody
public void test() {
    int a=5000000;
    //模拟内存溢出的场景

    for(int i=0;i<a;i++){
        ThreadPoolExecutor thread= new ThreadPoolExecutor(20, Integer.MAX_VALUE, 30l, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
        final int s = i;
        thread.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(s);
            }
        });

    }
}

这里循环创建 线程池 但是资源未释放  导致内存溢出。

每日一博 | 关于 jvm 分析的指令及 jprofiler 初体验

访问之后  可以看出大量创建线程

每日一博 | 关于 jvm 分析的指令及 jprofiler 初体验

并且大量threadpoolExecutor的资源没有被释放

另外jprofiler  的下载地址:http://www.ej-technologies.com/products/jprofiler/overview.html

以及注册方式:http://blog.csdn.net/attilax/article/details/17077857

这里主要是刚接触的 学习的过程  但是有很多问题还没搞清  后续实际用到这些知识解决问题 会更新博客

原文  https://my.oschina.net/u/2487314/blog/798416
正文到此结束
Loading...