JVM——堆(Heap)

简介

一个JVM中只有一个堆内存,堆内存的大小可以调节
它主要存储类实例化的对象,包括方法,常量,变量~

堆内存主要分为三个区域。

  • 新生区 Young/New
  • 养老区 Old
  • 永久区 pre

JVM——堆(Heap)_第1张图片

接下来详细介绍一下这几个概念。

经过研究,99%的对象都是临时对象。因此当我们使用完之后,需要对其进行清理。Java自动帮我们做了这个事情,简称GC(垃圾回收)。

新生区

  • 它是类 诞生和成长的地方,甚至死亡。
  • 伊甸园 :几乎所有的对象都是从伊甸园new出来的
  • 幸存者区(0/1):当伊甸园中的空间满时,JVM会进行一次轻GC,一些对象可能就此消失,而逃过一劫的,则会进入幸存者0区或1区

养老区

  1. 当一个对象太大(如大的数组或者很长的字符串),伊甸园区剩余的空间不够,JVM会进行一个轻GC,如果空间仍然不够,则这个对象会自动进入老年区。
  2. 当幸存者区空间满了,JVM会进行一次重GC(包括新生区和养老区),存活下来的对象会进入养老区。

当养老区也满了,堆中已经没有空间来创建对象了,这时就会报OOM异常(out of memory)内存溢出。这时就需要调优。

经过上边的说明,应该知道GC(垃圾回收)主要是在新生区中。

永久区

这个区域常驻内存的。用来存放JDK自身携带的Class对象,Interface元数据,存储的是Java运行时的一些环境或类信息,这个区域不存在垃圾回收!关闭VM虚拟就会释放这个区域的内存~

名称变化

  • jdk1.6之前:永久代,常量池是在方法区;
  • jdk1.7 :永久代,但是慢慢的退化了,去永久代,常量池在堆中
  • jdk1.8 之后:元空间,无永久代,常量池在元空间(堆中)

关于堆的内容就介绍到这里,想了解更多JVM知识,请点击这里

你可能感兴趣的:(JVM,java,jvm,编程语言,堆栈)