JAVA虚拟机发生GC的过程简要分析(待续...)

了解JVM发生GC的原因以及过程,才可以更加针对的对虚拟机进行内存分配,从而减少full gc,避免造成系统卡顿甚至系统崩溃

FULL GC带来的危害(STW)

在发生FULL GC的时候,意味着JVM会安全的暂停所有正在执行的线程(Stop The World),来回收内存空间,在这个时间内,所有除了回收垃圾的线程外,其他有关JAVA的程序,代码都会静止,反映到系统上,就会出现系统响应大幅度变慢,卡机等状态

JVM的堆内存空间

  1. Eden(伊甸园)区域:用来存放使用new或者newInstance等方式创建的对象,默认这些对象都是存放在Eden区,除非这个对象太大,或者超出了设定的阈值-XX:PretenureSizeThresold,这样的对象会被直接分配到Old区域。
  2. 2个Survivous(幸存)区域:一般称为S0,S1或者From Survivous,To Survivous ,理论上他们一样大。

第一次GC(minor GC)

当不断地创建对象,当Eden区域占满的时候,此时开始做Young GC也叫做Minor GC,第一次GC时Survivous中S0区和S1区都为空,Eden区域执行GC后不能被回收的对象->S0,若进入S0区域的对象大小超过S0区域的阈值,则直接进入old区域,等等

第二次GC(minor GC)

当第二次Eden区域被占满时,此时开始做GC,将Eden和From Survivous(S0)中经过GC未被回收的对象迁移到To Survivous(S1),等等

以次类推,始终保证S0和S1有一个空的,用来存储临时对象,用于交换空间的目的。反反复复多次没有被淘汰的对象,将会被放入Old区域中,默认15次(由参数--XX:MaxTenuringThreshold=15 决定)

综合上述的过程可知S0和S1的区域分配的空间一定要大小合适,避免一个对象大于S0或者S1区域的阈值,导致直接进入Old区域

猜你喜欢

转载自blog.csdn.net/a1_HelloWord/article/details/104418684