Heap 堆
1、定义
一个JVM实例只有一个堆内存,堆也是Java内存管理的核心区域,堆在JVM启动的时候创建,其空间大小也被创建,是JVM中最大的一块内存空间,所有线程共享Java堆
像程序计数器、本地方法栈、虚拟机栈都是线程私有的,而堆(Heap)、方法区都是线程共享的区域。通过new关键字创建的对象都会使用堆内存。
1.1堆空间细分
Java7及以前将堆空间逻辑上分成三部分:新生区+养老区+永久代
Java8及以后将堆内存逻辑上分为:新生区+养老区+元空间
新生代分为了eden(伊甸园)、survivor1(幸存区)、survivor2,对象创建先放在eden中,经过一定时间还幸存就会放在幸存者区再大一点就去老年代
2、特点
1.他是线程共享的,堆中对象都需要考虑到线程安全问题
2.有垃圾回收机制
3、堆内存溢出
java.lang.OutOfMemoryError: Java heap space
这里的List集合因为它一直在作用范围内被用着所以是不会被垃圾回收的,而越来越变长的字符串对象也一直被追加到list中,所以随着字符串对象越来越多,堆空间就会被占满了。
堆内存诊断
1.jps工具
查看当前系统中有哪些java进程
2.jmap工具
查看堆内存的占用情况 jmap -heap 进程id
3.jconsole工具
图形化界面的多功能的监测工具,可以连续监测