简介
一个JVM中只有一个堆内存,堆内存的大小可以调节
它主要存储类实例化的对象,包括方法,常量,变量~
堆内存主要分为三个区域。
- 新生区 Young/New
- 养老区 Old
- 永久区 pre
接下来详细介绍一下这几个概念。
经过研究,99%的对象都是临时对象。因此当我们使用完之后,需要对其进行清理。Java自动帮我们做了这个事情,简称GC(垃圾回收)。
新生区
- 它是类 诞生和成长的地方,甚至死亡。
- 伊甸园 :几乎所有的对象都是从伊甸园new出来的
- 幸存者区(0/1):当伊甸园中的空间满时,JVM会进行一次轻GC,一些对象可能就此消失,而逃过一劫的,则会进入幸存者0区或1区
养老区
- 当一个对象太大(如大的数组或者很长的字符串),伊甸园区剩余的空间不够,JVM会进行一个轻GC,如果空间仍然不够,则这个对象会自动进入老年区。
- 当幸存者区空间满了,JVM会进行一次重GC(包括新生区和养老区),存活下来的对象会进入养老区。
当养老区也满了,堆中已经没有空间来创建对象了,这时就会报OOM异常(out of memory)内存溢出。这时就需要调优。
经过上边的说明,应该知道GC(垃圾回收)主要是在新生区中。
永久区
这个区域常驻内存的。用来存放JDK自身携带的Class对象,Interface元数据,存储的是Java运行时的一些环境或类信息,这个区域不存在垃圾回收!关闭VM虚拟就会释放这个区域的内存~
名称变化
- jdk1.6之前:永久代,常量池是在方法区;
- jdk1.7 :永久代,但是慢慢的退化了,去永久代,常量池在堆中
- jdk1.8 之后:元空间,无永久代,常量池在元空间(堆中)
关于堆的内容就介绍到这里,想了解更多JVM知识,请点击这里