17 堆定义
通过new关键字创建,创建对象都会使用堆内存。
是线程共享的,需要考虑线程安全问题。
有垃圾回收机制。
18 堆-内存溢出
当默认情况下,发现执行到26,出现内存溢出。
当我们将堆内存调为8m,继续执行,如图2.发现支循环了17次。-Xmx=8m;下面的demo展示一下为何内存溢出;
因为list的生命周期是在try块里,每次新建对象,而且不被回收。
代码如下。
public class Demo1_5 {public static void main(String[] args) {int i=0;try{List<String> list=new ArrayList<>();String a="hello";while (true){list.add(a);a=a+a;i++;}}catch (Throwable e){e.printStackTrace();System.out.println(i);}}
}
19 堆-内存诊断jmap
jps 查看有哪些java进程
jmap 查看堆内存占用情况jmap -heap 进程id 查看堆内存占用情况。
也可以发现,新创建的对象会放在eden区。
Heap Usage
测试代码
public class Demo1_4 {public static void main(String[] args) throws Exception{System.out.println("1.....");Thread.sleep(30000);byte[] array=new byte[1024*10*1024];System.out.println("2....");Thread.sleep(20000);array=null;System.gc();System.out.println("3....");Thread.sleep(100000L);}
}
创建数组对象前(hh,我手速太慢了)。。。