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

目录

深刻JVM 原理(一)Java内存模型:http://www.noobyard.com/article/p-vcuxafar-mx.html
深刻JVM原理(二)Java对象访问模式:http://www.noobyard.com/article/p-kshslmnp-ma.html
深刻JVM原理(三)JVM 垃圾收集:http://www.noobyard.com/article/p-ztnmzyos-kr.html
深刻JVM原理(四)JVM垃圾回收流程:http://www.noobyard.com/article/p-anmqpmkm-cy.html
深刻JVM原理(五)Java堆内存调整参数(调优关键):http://www.noobyard.com/article/p-eltveokx-mg.html
深刻JVM原理(六)年轻代:http://www.noobyard.com/article/p-atmiidnt-ks.html
深刻JVM原理(七)老年代、永久代和元空间:http://www.noobyard.com/article/p-vaxbmhqe-ea.html
深刻JVM原理(八)JVM垃圾回收策略:http://www.noobyard.com/article/p-adodzhii-ds.html
深刻JVM原理(九)JVM垃圾回收策略参数配置:http://www.noobyard.com/article/p-yopfenvx-mg.html
深刻JVM原理(十)G1收集器:http://www.noobyard.com/article/p-olmrbdgd-mw.html
深刻JVM原理(十一)Java引用类型:http://www.noobyard.com/article/p-hsennvkb-ks.htmljava

咱们全部的数据都会保存在JVM的堆内存之中,可是实际的开发中会常常建立不少临时对象和常驻对象。因此,为了保证GC的性能问题,对于GC的处理流程以下图所示:面试

这里写图片描述

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

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

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

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