使用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]);
}
步骤:
- 启动程序生成斐波那契 并保存到数组中
- 启动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的更多相关文章
- 使用jconsole分析内存情况
http://www.cnblogs.com/dava/p/6686436.html
- Android最佳性能实践(二)——分析内存的使用情况
由于Android是为移动设备开发的操作系统,我们在开发应用程序的时候应当始终把内存问题充分考虑在内.虽然Android系统拥有垃圾自动回收机制,但这并不意味着我们就可以完全忽略何时去分配或释放内存. ...
- Android使用procrank和dumpsys meminfo 、top分析内存占用情况
如果你想查看所有进程的内存使用情况,可以使用命令procrank.dumpsys meminfo查看,当然也只可以过滤出某个进程如:dumpsys meminfo | grep -i phone 先来 ...
- JVM探秘:MAT分析内存溢出
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. MAT是分析Java堆内存的一个工具,全称是 The Eclipse Memory A ...
- 用jconsole监视内存使用情况
最近做性能压测,学习到可以用jconsole查看内存使用(连接端口:JMX_PORT=8060). 打开后发现,老年代内存一直无法释放,应该是应用启动参数中,老年代内存分配不够.加大内存,得到缓解:- ...
- 使用Memory Analyzer tool(MAT)分析内存泄漏(二)
转载自:http://www.blogjava.net/rosen/archive/2010/06/13/323522.html 前言的前言 写blog就是好,在大前提下可以想说什么写什么,不像投稿那 ...
- 使用Memory Analyzer tool(MAT)分析内存泄漏
前言的前言 写blog就是好,在大前提下可以想说什么写什么,不像投稿那么字字斟酌.上周末回了趟成都办事,所以本文来迟了.K117从达州经由达成线往成都方向走的时候,发现铁路边有条河,尽管我现在也不知道 ...
- JVM内存结构/JVM运行时数据区,以及堆内存的划分
1.程序计数器: 程序计数器是线程私有的内存,JVM多线程是通过线程轮流切换并分配处理器执行时间的方式实现的,当线程切换后需要恢复到正确的执 行位置(处理器)时,就是通过程序计数器来实现的.此内存区域 ...
- Java内存管理:Java内存区域 JVM运行时数据区
转自:https://blog.csdn.net/tjiyu/article/details/53915869 下面我们详细了解Java内存区域:先说明JVM规范定义的JVM运行时分配的数据区有哪些, ...
随机推荐
- MIUI6系统详细卡刷开发版获得root权限的经验
小米的手机不同手机型号通常情况miui论坛都提供两个不同的版本,分别为稳定版和开发版,稳定版没有提供ROOT权限管理,开发版中就开启了ROOT权限,很多情况下我们需要使用的一些功能强大的App,都需要 ...
- vscode中使用markdown(转)
vscode 是微软推出一款轻量级的文本编辑工具,类似于sublime,由于其拥有丰富的插件,安装使用也非常简单,所以深受广大程序员的喜爱. markdown 是一种可以使用普通文本编辑器编写的标记语 ...
- Linq to SQL -- Group By、Having和Exists、In、Any、All、Contains
Group By/Having操作符 适用场景:分组数据,为我们查找数据缩小范围. 说明:分配并返回对传入参数进行分组操作后的可枚举对象.分组:延迟 1.简单形式: var q = from p in ...
- 如何简单理解js中this的指向
前序 每个人学js都会被this指向这个东西搞得很蒙,那就是this的指向问题.首先,我们要明白 this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上thi ...
- 七层协议&网络配置
1.输入CMD 2.ipconfig-all 可查看详细的电脑网络配置,子网掩码(subnet mask)又叫网络掩码.地址掩码.子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网 ...
- java8-函数编程
在Function里面看到一个很奇怪的代码 static <T> Function<T, T> identity() { return t -> t; } 手动写了几个代 ...
- 转载:深入浅出Zookeeper
ZAB协议 ZAB协议是专门为zookeeper实现分布式协调功能而设计.zookeeper主要是根据ZAB协议是实现分布式系统数据一致性. zookeeper根据ZAB协议建立了主备模型完成zook ...
- github PageHelper使用PageInfo数据错乱问题
如果出现了数据错乱,检查一下代码是否正确 PageHelper.start(1,10); List<MyEntity> lists = mapper.query(); PageInfo&l ...
- SpringBoot多模块项目打包问题
项目结构图如下: 在SpringBoot多模块项目打包时遇见如下错误: 1.repackage failed: Unable to find main class -> [Help 1] 解决步 ...
- PHP提交订单,信息的传递
今天被之前的同事问到订单这一块(他用的是Laraver)..."多个商品在同一个订单里,怎么将相同的商品放进一个分组"... 当时我和他的反应都是,array_push, arra ...