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%效果明显。

系统垃圾收集部明显。

使用jconsole分析内存情况-JVM的更多相关文章

  1. 使用jconsole分析内存情况

    http://www.cnblogs.com/dava/p/6686436.html

  2. Android最佳性能实践(二)——分析内存的使用情况

    由于Android是为移动设备开发的操作系统,我们在开发应用程序的时候应当始终把内存问题充分考虑在内.虽然Android系统拥有垃圾自动回收机制,但这并不意味着我们就可以完全忽略何时去分配或释放内存. ...

  3. Android使用procrank和dumpsys meminfo 、top分析内存占用情况

    如果你想查看所有进程的内存使用情况,可以使用命令procrank.dumpsys meminfo查看,当然也只可以过滤出某个进程如:dumpsys meminfo | grep -i phone 先来 ...

  4. JVM探秘:MAT分析内存溢出

    本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. MAT是分析Java堆内存的一个工具,全称是 The Eclipse Memory A ...

  5. 用jconsole监视内存使用情况

    最近做性能压测,学习到可以用jconsole查看内存使用(连接端口:JMX_PORT=8060). 打开后发现,老年代内存一直无法释放,应该是应用启动参数中,老年代内存分配不够.加大内存,得到缓解:- ...

  6. 使用Memory Analyzer tool(MAT)分析内存泄漏(二)

    转载自:http://www.blogjava.net/rosen/archive/2010/06/13/323522.html 前言的前言 写blog就是好,在大前提下可以想说什么写什么,不像投稿那 ...

  7. 使用Memory Analyzer tool(MAT)分析内存泄漏

    前言的前言 写blog就是好,在大前提下可以想说什么写什么,不像投稿那么字字斟酌.上周末回了趟成都办事,所以本文来迟了.K117从达州经由达成线往成都方向走的时候,发现铁路边有条河,尽管我现在也不知道 ...

  8. JVM内存结构/JVM运行时数据区,以及堆内存的划分

    1.程序计数器: 程序计数器是线程私有的内存,JVM多线程是通过线程轮流切换并分配处理器执行时间的方式实现的,当线程切换后需要恢复到正确的执 行位置(处理器)时,就是通过程序计数器来实现的.此内存区域 ...

  9. Java内存管理:Java内存区域 JVM运行时数据区

    转自:https://blog.csdn.net/tjiyu/article/details/53915869 下面我们详细了解Java内存区域:先说明JVM规范定义的JVM运行时分配的数据区有哪些, ...

随机推荐

  1. 关于如何在电脑上安装adb来操作手机(Android)的方法及步骤

    1.需要真实的安卓手机: 2.安卓手机需要开启USB调试模式,允许电脑进行调试(各个手机的开启方式可能不同,不知道的自行百度): 3.电脑需要安装ADB驱动,这里提供一个下载地址:https://ad ...

  2. 使用JavaMail创建邮件和发送邮件

    参考https://www.cnblogs.com/xdp-gacl/p/4216311.html,写的真好,知识在于分享,备份留着看 一.RFC882文档简单说明 RFC882文档规定了如何编写一封 ...

  3. ExcelPackage 读取、导出excel

    private static string GetString(object obj) { try { return obj.ToString(); } catch (Exception ex) { ...

  4. 201772020113李清华《面向对象程序设计(java)》第九周学习总结

    1.实验目的与要求 (1) 掌握java异常处理技术: (2) 了解断言的用法: (3) 了解日志的用途: (4) 掌握程序基础调试技巧: 2.实验内容和步骤 实验1:用命令行与IDE两种环境下编辑调 ...

  5. cdh启动datanode报错

    问题: 为cdh新增节点时,在分配datanode后,启动报错 Can't open /iot/opt/cloudera-manager/cm-5.11.2/run/cloudera-scm-agen ...

  6. nodeJs 操作Mysql数据库

    nodeJs下操作数据库需要安装npm模块: mysql npm install mysql --save-dev 新建express项目 express --view=ejs 在项目根目录下新建数据 ...

  7. V-REP Remote API(C++)实现简单的关节转动

    基础内容参考:https://www.cnblogs.com/eternalmoonbeam/p/10753149.html V-REP客户端设置: 在V-REP场景文件中需要添加三个实体,包括两个形 ...

  8. Maven中聚合与集成的区别

    如test-parent是一个聚合工程,打包方式为pom.xml test-a是test-parent的一个moudle模块,打包方式为jar,并且继承自test-parent: test-b是tes ...

  9. centos7.4重置root密码

    1- 在启动grub菜单,选择编辑选项启动 2 - 按键盘e键,来进入编辑界面 3 - 找到Linux 16的那一行,将ro改为rw init=/sysroot/bin/sh 4 - 现在按下 Con ...

  10. C#中生成GUID的四种格式

    var uuid = Guid.NewGuid().ToString(); // 9af7f46a-ea52-4aa3-b8c3-9fd484c2af12 var uuidN = Guid.NewGu ...