Java堆内存中为什么有两个survival区及为什么与年轻代比例是1:1:8?

Posted dretrtg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java堆内存中为什么有两个survival区及为什么与年轻代比例是1:1:8?相关的知识,希望对你有一定的参考价值。

  Java堆内存分为年轻代和老年代,其中,年轻代分为Eden区和survival区,survival又分为fromSurvival和toSurvival。

  首先第一个问题:为什么要有Survival区?因为如果没有Survival区,Eden每进行一次MinorGC,存活对象送到老年代,当老年代被填满就会触发MajorGC,消耗大量时间。当有Survival区后,存活对象可以先被放到此处做一个缓冲,只有经过16次筛选还存活的对象才被移送到老年代,减少MajorGC的发生。

  第二个问题:为什么设置两个Survival区?因为第一次MinorGC后,Survival就会存在一些存活对象,第二次MinorGC后,Eden区的存活对象会放入Survival区,就会与Survival区之前的对象内存不连续,形成内存碎片,时间一长就会影响性能,因此需要两个Survival区,第一次MinorGC时,Eden区的存活对象转移到fromSurvival区,Eden清空,第二次MinorGC时,将Eden和fromSurvival区中存活对象转移到toSurvival,Eden和fromSurvival清空。fromSurvival和toSurvival交换角色,循环往复16次后,再传向老年代。

  


tip:当对象超过Eden区的话,会直接进入老年代!!

以上是关于Java堆内存中为什么有两个survival区及为什么与年轻代比例是1:1:8?的主要内容,如果未能解决你的问题,请参考以下文章

转!!Java虚拟机堆的内存分配和回收

007-对象内存分配与回收

实例详解C++程序的五大内存分区

Java堆内存与栈内存对比

Java中的“==操作符”和equals方法有什么区别

java:jvm:JVM堆区新生代为什么有两个Survivor