JVM笔记五-堆区
JVM笔记五-堆区
在JVM中,堆区是重中之重。通过前面文章的学习,我们知道了,栈区是不会有垃圾回收的,所以,经常说的垃圾回收,其实就是回收的是堆区的数据。在这里,我们将会看到传说中的,新生代、老年代、永久代(元空间)。凯哥Java(kaigejava)欢迎大家一起学习。
堆(Heap):
一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行,堆内存分为三个部分:
堆内存分区:
Young Generation Space 新生区 Young/New
Tenure generation space 老年代 Old/Tenure
Permanent space 永久区/元空间 Perm
Java 7之前的堆内存示意图:
简版流程:
新生区是类的诞生、成长、消亡的区域,一个类在这里产生、应用,最后被垃圾回收器收集,结束生命。
新生区又分为两部分:伊甸园区(Eden space)和幸存者区(Survivor space)。所有的类都是在伊甸园区被new出来的。
幸存区有两个:0区(Survivor 0 space)和1区(Survivor 1 space).
当伊甸园区的空间用完时候,程序又需要创建对象,JVM的垃圾回收器将对伊甸园区进行垃圾回收(Minor GC,也叫轻GC 或者是YGC),将伊甸园区中的不再被其他对象所引用的对象进行销毁。然后伊甸园中的剩余对象移动到幸存0区(也叫from区)。若幸存0区也满了,再对该地区进行垃圾回收,然后移动到1区(也叫to区)。
如果1区也满了怎么办呢?在经历了15次YGC后,幸存1区也满了,那么这个时候,JVM将会把这些数据移动到养老区。如果养老区也满了,这个时候就会进行MajorGC(也称Full GC 检查FGC)。执行full GC对养老区的内存进行清理。如果养老区执行了Full GC之后,发现依然无法进行对象的保存,这个时候就会出现OOM(OutOfMemoryError)异常了。
如果出现了java.lang.OutOfMemoryError:java heap space异常。说明Java虚拟机的堆内存不够用了。主要原因有以下两种:
1:java虚拟机的堆内存设置不够,可以通过参数-Xms、-Xmx来调整
2:代码中创建了大量的大对象,并且长时间不能被垃圾回收器回收的(内存地址被引用了)
当你的才华撑不起你的野心的时候,你就应该静下心来学习;
当你的能力还驾驭不了你的目标时,就应该沉下心来,历练;
梦想,不是浮躁,而是沉淀和积累,只有拼出来的美丽,没有等出来的辉煌,机会永远是留给最渴望的那个人,学会与内心深处的你对话,问问自己,想要怎样的人生,静下心来学习,耐心沉淀,送给自己,共勉!
上一篇: JVM笔记九-GC收集器日志信息学习
推荐阅读
-
03-JVM内存模型:堆与方法区
-
JVM中堆、栈、方法区之间怎么交互
-
JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )(转载)
-
【JVM笔记】Java堆溢出
-
OOM实战:堆内存溢出 虚拟机栈和本地方法栈溢出 jvm栈容量太小 栈帧太大 栈太小,导致线程分配少,创建更多的线程将导致oom 方法区和运行时常量池溢出
-
JVM入门(位置、体系结构、类加载器、双亲委派机制、沙箱安全机制、Native、PC寄存器、方法区、堆(新生区{伊甸园区、幸存区}、养老区、永久区)、OOM、GC算法、JMM)
-
JVM笔记五-堆区
-
JVM笔记八-堆参数调优
-
03-JVM内存模型:堆与方法区
-
JVM---栈、堆、方法区的交互关系