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