Java虛擬機將堆分為年輕代和老年代。其中,新生對象首先被分配到年輕代內存區域,而老年代則是存儲生命周期比較長的對象。下面我們來了解一下關于年輕代和老年代的更多細節。
年輕代分為Eden區和Survivor區(From區和To區),其中,大部分新分配的對象都會被分配到Eden區域。當Eden區域滿了之后,Java虛擬機會將活著的對象復制到Survivor區域的From區域中。在下一次垃圾回收時,活著的對象會被復制到To區域中。這樣的操作稱為Minor GC。
public class MyObject { byte[] bytes = new byte[1024 * 1024]; } public class Demo { public static void main(String[] args) { while (true) { for (int i = 0; i< 5; i++) { MyObject myObject = new MyObject(); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
在上面這段代碼中,定義了MyObject類,并創建了一個大小為1MB的byte數組。在main方法中,無限循環創建了5個MyObject對象。當Eden區域被填滿時,會進行Minor GC操作,將活著的對象復制到Survivor區域。在經過多次GC之后,仍然存活的對象會被移動到老年代中。
老年代主要存放一些生命周期比較長的對象,一般情況下不需要進行太頻繁的GC操作。當老年代內存不足時,會進行Full GC操作,這個會比Minor GC慢很多,甚至會引發應用程序的停頓。因此,我們需要合理地進行年輕代和老年代的內存分配,以及進行相應的優化,以提高應用程序的性能。