您好,登錄后才能下訂單哦!
JAVA虛擬機的垃圾收集器是虛擬機內存的清道夫,它的存在讓JAVA開發人員能將更多精力投入到業務研發上。了解垃圾收集器,并利用好這個工具,能更好的保障服務穩定性。這篇文章通過分析JAVA虛擬機內存模型,介紹垃圾收集器常用算法和收集器類別,使得垃圾收集器的配置和使用變得不再遙不可及。
JAVA虛擬機內存可以劃分為:虛擬機棧、本地方法棧、JAVA堆內存、方法區(包含運行時常量池)、程序計數器、直接內存。
虛擬機棧是線程私有的,生命周期跟線程相同。也就是說一個線程被創建后,虛擬機為其分配了一個獨立的棧幀來存儲線程的局部變量、操作數、動態鏈接、方法出口等信息,當線程結束后,該棧幀也會被回收清理。
本地方法棧是虛擬機的native方法執行期間使用的一個棧幀。
堆內存是被所有線程共享的一塊區域,用來存放對象實例和數組,屬于內存中最大的一塊區域,也是垃圾收集的主要區域。從垃圾收集的角度看,堆內存經常分為新生代和老年代。
方法區也是被所有線程共享的一塊區域,用來存儲被虛擬機加載的類信息、常量、靜態變量、JIT編譯后代碼等數據。也可以成為永久代。
程序計數器是線程私有的,作為當前線程所執行的字節碼的行號指示器,每個線程有一個程序計數器,用于記錄CPU切換線程時記錄當前線程的執行位置,以便下次繼續從當前位置往下執行。
這塊不屬于JAVA虛擬機內存,但使用頻繁,也可稱之為“堆外內存”
根據上述對JAVA虛擬機內存區域模型的介紹,我們知道JAVA程序中的對象實例都存儲在JAVA堆內存中,因此垃圾收集主要也是針對堆內存進行。為了更好的管理JAVA對象實例,并結合對象實例的生存時間長短,JAVA虛擬機將堆內存分為新生代和老年代,分別存儲剛創建不久的對象和存活較長時間的對象實例,并采用分代收集的策略分別回收新生代和老年代的內存。
由于虛擬機中的垃圾收集是分代收集的,新生代和老年代的垃圾收集策略不太一樣,所以一般是使用針對新生代和老年代的垃圾收集器組合。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。