JVM的Heap堆

栈+堆+方法区的交互关系

Person p1 = new Person()
Person // 模板也就是大的Class在方法区里面
p1 // 引用在Java栈里面
new Person() // 在Java堆里面

在这里插入图片描述

Head堆(Java7之前)
一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存种,保存所有引用类型的真实信息,以方便执行器执行。

  • Young Generation Space 新生区 Young/New
  • Tenure generation Space 养老区 Old/Tenure
  • Permanent Space 永久区 Perm

堆内存在逻辑上分为三部分:新生+养老+永久。

Java8以后永久变成元空间,分为新的三部分:新生+养老+元空间。
在这里插入图片描述
Head堆new对象的流程:

Eden满了,开启
GC = YGC = 轻GC
Eden基本全部清空
S0 = from
交换
Old养老区,满了,开启
Full GC = FGC = 重GC
Full GC多次,发现养老区没办法腾出来
OOM

新生区,简单讲解:新生区是类的诞生、成长、消亡的区域,一个类在这里产生,应用,最后被垃圾回收器收集,结束生命。新生区又分两部分:伊甸区(Eden Space)和幸存区(Survivor Space),所有的类都是在伊甸区被new出来的。在幸存区有两个:0区(Survivor 0 Space)和1区(Survivor 1 Space).当伊甸区的空间用完时,程序又需要创建对象,JVM的垃圾回收器将对伊甸园区进行垃圾回收(Minor GC),将伊甸园区中的不再被其他对象所引用的对象进行销毁。然后将伊甸园种的剩余对象移动到幸存0区。若幸存0区也满了,再对该区进行垃圾回收,然后移动到1区。那如果1区也满了呢?再移动到养老区。若养老区也满了,那么这个时候将产生MajorGC(Full GC),进行养老区的内存清理。若养老区执行了Full GC之后发现依然无法进行对象的保存,就会产生OOM异常:OutOfMemoryError。

默认是:15次之后向下移动

如果出现java.lang.OutOfMemoryError:Java heap space异常,说明Java虚拟机的堆内存不够。原因有两个:

  1. Java虚拟机的堆内存设置不够,可以通过参数-Xms、-Xmx来调整。
  2. 代码种创建了大量大对象,并且长时间不能被垃圾收集器手机(存在被引用)。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部