目录
- 环境
- 代码案例1:
- 代码案例2:
环境
jdk1.8+Mac+Idea
为了便于观察我们设置了虚拟机的参数VM oprions
,-Xms10m -Xmx10m
代码案例1:
新建了一个数组,向里面添加100个OutOfMemory
package com.rumenz; import java.util.ArrayList; import java.util.List; public class OutOfMemory { public byte []one=new byte[128*1024]; public static void main(String[] args) throws InterruptedException { Thread.sleep(5000); //延时5秒,方便我们打开`jconsole` append(100); } private static void append(int n) throws InterruptedException { List<OutOfMemory> list=new ArrayList<>(); for (int i = 0; i < n; i++) { Thread.sleep(3000); //拖慢添加速度,方便我们观察 list.add(new OutOfMemory()); } } }
运行程序后迅速打开jconsole
,并找到自己编写的类,点击进入,选择不安全链接
> jconsole
由于我们使用的是成员变量,所以垃圾回收器一致不能回收内存,所以整个堆的内存趋势是一路上涨.
代码案例2:
package com.rumenz; import java.util.ArrayList; import java.util.List; public class OutOfMemory { public OutOfMemory() { byte []one=new byte[128*1024]; } public static void main(String[] args) throws InterruptedException { Thread.sleep(5000); append(100); } private static void append(int n) throws InterruptedException { List<OutOfMemory> list=new ArrayList<>(); for (int i = 0; i < n; i++) { Thread.sleep(3000); list.add(new OutOfMemory()); } } }
与上面代码的区别我们one
变量有成员变量变成了局部变量. 局部变量在栈上分配内存,当方法结束,栈空间消失,栈上的变量或者引用地址将失效,本案例中one
对象是分配在堆内存上,栈空间的消失导致one
对象无法被使用到,随后就会被垃圾回收掉. 所以本案例的堆内存变量将呈现出折线的效果.
以上就是Java垃圾回收jconsole分析的详细内容,更多关于Java垃圾回收jconsole的资料请关注本网站其它相关文章!
您可能感兴趣的文章:
- java性能分析jconsole详解
- Java JConsole远程连接配置案例详解
- 解决java maven项目找不到jconsole-1.8.0.jar和tools-1.8.0.jar包问题
- 如何利用JConsole观察分析Java程序的运行并进行排错调优