1. 程式人生 > >JVM 物件的記憶體分配策略

JVM 物件的記憶體分配策略

一、概述

         jvm提倡的是自動記憶體管理,也就是解決兩個問題,給物件分配記憶體和回收分配的記憶體,本文主要簡單介紹給物件分配記憶體的策略。

二、物件優先在Eden區分配

         大多數情況物件在新生代Eden區中分配,如果Eden區中中記憶體不足分配時,jvm會觸發一次Minor GC(新生代的垃圾回收),如果Minor GC後還是沒用足夠的記憶體分配,則會在Survivor區分配記憶體,如果Survivor區記憶體也不足,則會把Survivor區的物件,通過擔保機制提前轉移到老年代去。

三、大物件直接進入老年代

         這裡的大物件指的是需要連續記憶體空間的物件,別如說很長的字串以及陣列,給大物件分配記憶體可能會導致會提前觸發垃圾收集機制,來獲取足夠的連續空間,會導致Eden區和Survivor區大量的記憶體複製,jvm提供了-XX:PretenureSizeThreshould引數,大於這個引數的物件直接分配到老年代。這個引數只有能Serial和ParNew 兩個收集器能識別。

四、長期存活的物件將進入老年代

       JVM給每個物件分配了年齡計數器,計數的規則如下:

       1、如果物件在Eden區經過第一次Minor GC並被移動到Survivor區則年齡設為1。

       2、物件在Survivor區每經過一次Minor GC則年齡加一。

       3、當年齡增加到一定程度,預設是15,則會被移動到老年代。

        為了能更好的適應不同程式的記憶體情況,jvm並不是所有物件都要等到年齡到達一定程度後再移動到老年代,如果Survivor區相同年齡所有物件的大小總和大於了Survivor區大小的一半,則會把年齡等於和大於該年齡的物件直接移動到老年代。