深入JVM 原理(四)JVM垃圾回收流程

目录

深入JVM 原理(一)Java内存模型:https://blog.csdn.net/qq_39827935/article/details/81285009
深入JVM原理(二)Java对象访问模式:https://blog.csdn.net/qq_39827935/article/details/81285038
深入JVM原理(三)JVM 垃圾收集:https://blog.csdn.net/qq_39827935/article/details/81285059
深入JVM原理(四)JVM垃圾回收流程:https://blog.csdn.net/qq_39827935/article/details/81285084
深入JVM原理(五)Java堆内存调整参数(调优关键):https://blog.csdn.net/qq_39827935/article/details/81285099
深入JVM原理(六)年轻代:https://blog.csdn.net/qq_39827935/article/details/81285115
深入JVM原理(七)老年代、永久代和元空间:https://blog.csdn.net/qq_39827935/article/details/81285133
深入JVM原理(八)JVM垃圾回收策略:https://blog.csdn.net/qq_39827935/article/details/81285156
深入JVM原理(九)JVM垃圾回收策略参数配置:https://blog.csdn.net/qq_39827935/article/details/81285175
深入JVM原理(十)G1收集器:https://blog.csdn.net/qq_39827935/article/details/81285207
深入JVM原理(十一)Java引用类型:https://blog.csdn.net/qq_39827935/article/details/81285227

我们所有的数据都会保存在JVM的堆内存之中,但是实际的开发中会经常创建很多临时对象和常驻对象。所以,为了保证GC的性能问题,对于GC的处理流程如下图所示:

这里写图片描述

对于整个GC流程里,最需要处理的就是年轻代和老年代的内存清理操作,而元空间(永久代)都不在GC范围内;

  1. 当现在有一个新的对象产生,那么对象一定需要内存空间,于是现在就需要为该对象进行内存空间的申请。
  2. 首先会判断伊甸园区是否有内存空间,如果此时有内存空间,则将新对象保存在伊甸园区;
  3. 但如果伊甸园区的内存空间不足,那么会自动执行一个 Minor GC 操作,将伊甸园区无用的内存空间进行清理,当清理之后会继续判断伊甸园区的内存空间是否充足?充足则将新的对象进行空间分配;
  4. 如果执行了 Minor GC 之后发现伊甸园区的内存依然不足,那么这个时候会进行存货区判断,如果存活区有剩余空间,则将伊甸园区的部分对象保存在存活区,那么随后继续判断伊甸园区的内存空间是否充足,如何内存充足,则在伊甸园区进行空间分配;
  5. 如果此时存活区也已经没有内存空间了,则开始判断老年区,如果此时老年区的空间充足,则将存活区中的活跃对象保存在老年代,而后存活区就会存现有空余空间,随后,伊甸园区将活跃对象保存在存活区之中,而后在伊甸园区里为新对象开辟内存空间;
  6. 如果这个时候老年代也满了,那么这个时候将产生 Major GC(Full GC),进行老年代的内存清理;
  7. 如果老年代执行了 Full GC 之后,依然无法进行对象的保存,就会产生 OOM()异常“OutOfMemoryError”。

面试题:请解释“StackOverflowError”和“OutOfMemoryError”的区别:

1、stackoverflow: 每当java程序启动一个新的线程时,java虚拟机会为他分配一个栈,java栈以帧为单位保持线程运行状态;当线程调用一个方法是,jvm压入一个新的栈帧到这个线程的栈中,只要这个方法还没返回,这个栈帧就存在。 
如果方法的嵌套调用层次太多(如递归调用),随着java栈中的帧的增多,最终导致这个线程的栈中的所有栈帧的大小的总和大于-Xss设置的值,而产生生StackOverflowError溢出异常。 
2、OutOfMemoryError: 如上。

猜你喜欢

转载自blog.csdn.net/qq_39827935/article/details/81285084