双十一|JVM笔记五-堆区


双十一|JVM笔记五-堆区
文章图片
双十一|JVM笔记五-堆区
JVM笔记五-堆区
【双十一|JVM笔记五-堆区】在JVM中 , 堆区是重中之重 。 通过前面文章的学习 , 我们知道了 , 栈区是不会有垃圾回收的 , 所以 , 经常说的垃圾回收 , 其实就是回收的是堆区的数据 。 在这里 , 我们将会看到传说中的 , 新生代、老年代、永久代(元空间) 。 凯哥Java(kaigejava)欢迎大家一起学习 。
堆(Heap):
一个JVM实例只存在一个堆内存 , 堆内存的大小是可以调节的 。 类加载器读取了类文件后 , 需要把类、方法、常变量放到堆内存中 , 保存所有引用类型的真实信息 , 以方便执行器执行 , 堆内存分为三个部分:
堆内存分区:
Young Generation Space\t新生区\tYoung/New
Tenure generation space\t老年代\tOld/Tenure
Permanent space\t永久区/元空间\tPerm
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:代码中创建了大量的大对象 , 并且长时间不能被垃圾回收器回收的(内存地址被引用了)
当你的才华撑不起你的野心的时候 , 你就应该静下心来学习;
当你的能力还驾驭不了你的目标时 , 就应该沉下心来 , 历练;
梦想 , 不是浮躁 , 而是沉淀和积累 , 只有拼出来的美丽 , 没有等出来的辉煌 , 机会永远是留给最渴望的那个人 , 学会与内心深处的你对话 , 问问自己 , 想要怎样的人生 , 静下心来学习 , 耐心沉淀 , 送给自己 , 共勉!