官术网_书友最值得收藏!

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 堆、方法區、棧的關系

主站蜘蛛池模板: 鄄城县| 清流县| 建德市| 黄大仙区| 双城市| 浮梁县| 马边| 额尔古纳市| 大姚县| 册亨县| 西平县| 诸暨市| 格尔木市| 成都市| 台南县| 浪卡子县| 宜州市| 佛教| 遂昌县| 颍上县| 慈利县| 苏尼特右旗| 甘洛县| 兴仁县| 邳州市| 明光市| 繁昌县| 常德市| 宝兴县| 临汾市| 新巴尔虎左旗| 乌苏市| 周宁县| 都兰县| 武胜县| 吉木萨尔县| 碌曲县| 沙洋县| 侯马市| 海南省| 无为县|