Java垃圾回收jconsole分析

环境:jdk1.8+Mac+Idea
为了便于观察我们设置了虚拟机的参数VM oprions,-Xms10m -Xmx10m

代码案例1:

新建了一个数组,向里面添加100个OutOfMemory

  1. package com.rumenz;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. public class OutOfMemory {
  5. public byte []one=new byte[128*1024];
  6. public static void main(String[] args) throws InterruptedException {
  7. Thread.sleep(5000); //延时5秒,方便我们打开`jconsole`
  8. append(100);
  9. }
  10. private static void append(int n) throws InterruptedException {
  11. List<OutOfMemory> list=new ArrayList<>();
  12. for (int i = 0; i < n; i++) {
  13. Thread.sleep(3000); //拖慢添加速度,方便我们观察
  14. list.add(new OutOfMemory());
  15. }
  16. }
  17. }

运行程序后迅速打开jconsole,并找到自己编写的类,点击进入,选择不安全链接

  1. > jconsole

图片alt

由于我们使用的是成员变量,所以垃圾回收器一致不能回收内存,所以整个堆的内存趋势是一路上涨.

图片alt

代码案例2:

  1. package com.rumenz;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. public class OutOfMemory {
  5. public OutOfMemory() {
  6. byte []one=new byte[128*1024];
  7. }
  8. public static void main(String[] args) throws InterruptedException {
  9. Thread.sleep(5000);
  10. append(100);
  11. }
  12. private static void append(int n) throws InterruptedException {
  13. List<OutOfMemory> list=new ArrayList<>();
  14. for (int i = 0; i < n; i++) {
  15. Thread.sleep(3000);
  16. list.add(new OutOfMemory());
  17. }
  18. }
  19. }

与上面代码的区别我们one变量有成员变量变成了局部变量. 局部变量在栈上分配内存,当方法结束,栈空间消失,栈上的变量或者引用地址将失效,本案例中one对象是分配在堆内存上,栈空间的消失导致one对象无法被使用到,随后就会被垃圾回收掉. 所以本案例的堆内存变量将呈现出折线的效果.

图片alt

返回笔记列表
入门小站