- 實戰Java虛擬機:JVM故障診斷與性能優化(第2版)
- 葛一鳴
- 519字
- 2024-01-08 16:10:55
2.3 對象去哪兒:辨清Java堆
Java堆是和Java應用程序關系最為密切的內存空間,幾乎所有的對象都存放在堆中,并且Java堆是完全自動化管理的,通過垃圾回收機制,垃圾對象會被自動清理,而不需要顯式地釋放。
根據垃圾回收機制的不同,Java堆有可能擁有不同的結構。最為常見的一種構成是將整個Java堆分為新生代和老年代。其中,新生代存放新生對象或者年齡不大的對象,老年代則存放老年對象。新生代有可能分為eden、s0、s1,其中s0和s1也被稱為from和to區域,它們是兩塊大小相等、可以互換角色的內存空間。詳細信息可以參閱第4章。
圖2.3顯示了一個堆空間的一般結構。

圖2.3 堆空間的一般結構
在絕大多數情況下,對象首先在eden區分配,在一次新生代回收后,如果對象還存活,則會進入s0或者s1,之后,每經過一次新生代回收,對象如果存活,它的年齡就會加1。當對象的年齡達到一定條件后,就會被認為是老年對象,從而進入老年代。
【示例2-2】下面通過一個簡單的示例,來展示Java堆、方法區和Java棧之間的關系。

上述代碼聲明了一個SimpleHeap類,并在main()函數中創建了兩個SimpleHeap實例,此時,各對象和局部變量的存放如圖2.4所示。SimpleHeap實例本身在堆中分配,描述SimpleHeap類的信息存放在方法區,main()函數中s1和s2局部變量存放在Java棧中,并指向堆中的兩個實例。

圖2.4 堆、方法區、棧的關系