关于jvm:Java垃圾回收jconsole分析

8次阅读

共计 1141 个字符,预计需要花费 3 分钟才能阅读完成。

环境: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 对象无奈被应用到, 随后就会被垃圾回收掉. 所以本案例的堆内存变量将呈现出折线的成果.

正文完
 0