7.2.4 オブジェクトの退避
年齢がしきい値に達していないJavaオブジェクトがTenured領域に移動することを,退避といいます。退避は,CopyGC実行時にEden領域およびFrom空間で使用中のオブジェクトが多くなり,移動先であるTo空間のメモリサイズが不足する場合に発生します。この場合,To空間に移動できなかったオブジェクトが,Tenured領域に移動します。
オブジェクトの退避が発生した場合,Tenured領域に本来格納されないはずの寿命の短いオブジェクトが格納されます。これが繰り返されると,CopyGCで回収されるはずのオブジェクトがメモリ空間に残っていくため,Javaヒープのメモリ使用量が増加していき,最終的にはFullGCが発生します。
オブジェクトの退避が発生した場合のメモリ使用量の変化について,次の図に示します。
FullGCでは,システムが数秒から数十秒停止することがあります。
したがって,メモリ空間の構成とメモリサイズを検討するときには,オブジェクトの退避が発生しないように,Eden領域とSurvivor領域のバランスを検討する必要があります。