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