zoukankan      html  css  js  c++  java
  • 使用jconsole分析内存情况-JVM

    JVM调优分析演练:

    Jconsole中对内存为如下结构:

    原始代码:

    public static void main(String[] args) {
    
                          BigInteger  [] pArr=new BigInteger [10000];
    
                    pArr[0]=new BigInteger("0");
    
                    pArr[1]=new BigInteger("1");
    
                    for (int i = 2; i < 10000; i++) {
    
                             pArr[i]=pArr[i-1].add(pArr[i-2]);
    
                             try {
    
                                         Thread.sleep(100);
    
                                } catch (InterruptedException e) {
    
                                         e.printStackTrace();
    
                                }
    
                             System.out.println("第"+i+":"+pArr[i]);
    
                       }

    步骤:

    1. 启动程序生成斐波那契 并保存到数组中
    2. 启动java分析工具 jconsole

     问题1.连接失败:

     

    启动之后 链接本地JAVA进程失败:在运行的JAVA中加入如下参数:

    -Dcom.sun.management.jmxremote  -Dcom.sun.management.jmxremote.port=8011 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

    如下图:

     

    进程实际情况如下,使用情况:

     

    通过观察发现一次次的堆内存使用量有较大幅度的变化,多次进行GC。

    进一步分析堆内存情况。

     

    每次经过GC之后老年区一直都在提升,说明对象在进行GC后被移动到老年区了。

     

    Eden新生区,对象随着时间的变化生成的速度越来越快,GC不断进行回收操作,系统频繁调用GC。

     

    存活期对象,在不断的进行GC操作之后,将被不断的从eden区copy到survive区,通过经过不多gc回收标记,在14:57时被批量移动到old区,所以空间在不断下降。

     

    而非堆区数据一致保持较平稳状况,所以内存较为平稳。

     

     通过分析发现,堆区对象在不断生成,并且不断增加,即使在进行回收的时候也无法回收掉,可以理解为,此处有与不断产生 斐波那契 序列并存储出现的问题,由于后续的数据非常大,所以非必须应该放弃缓存,或在获得结果后进行转存,如数据库等。

    另外,我们可以查看线程情况,通过下图可以查看main方法中的Thread.sleep();方法话费了2638,可以在程序中去掉。

     

    下图为程序运行的整体情况:

     

    下面对代码进行修改:

    BigInteger temp1=new BigInteger("0");
    
                          BigInteger temp2=new BigInteger("1");
    
                          BigInteger temp3=new BigInteger("0");
    
                          for (int i = 2; i < 10000; i++) {
    
                                   temp3= temp2;
    
                                   temp2=temp1.add(temp2);
    
                                   temp1=temp3;
    
                                   try {
    
                                         Thread.sleep(5);
    
                                } catch (Exception e) {
    
                                         // TODO: handle exception
    
                                }
    
                                 System.out.println("第"+i+":"+temp2);
    
                       }

    舍弃存储之后结果如下:老年区,不到3M与第一个8M,变成了原来的37.5%效果明显。

     

    系统垃圾收集部明显。

     

  • 相关阅读:
    GitHub教程学习笔记1本地Git管理
    GitHub教程学习笔记2远程仓库和本地仓库
    图像分割方法综述
    println输出乱码
    ngshow,ngif区别
    isFile() exists() isDirectory()的区别
    File类中的list和listFiles方法
    mkdir与mkdirs的区别
    新建play项目eclipsify后导入eclipse后无法debug调试
    大龄屌丝自学笔记Java零基础到菜鸟021
  • 原文地址:https://www.cnblogs.com/dava/p/6686436.html
Copyright © 2011-2022 走看看