java之分配和管理JVM內(nèi)存-創(chuàng)新互聯(lián)

成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比舞陽網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式舞陽網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋舞陽地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴。

這篇文章主要為大家詳細(xì)介紹了java分配和管理JVM內(nèi)存的方法,文中示例介紹的非常詳細(xì),圖文詳解容易學(xué)習(xí),非常適合初學(xué)者入門。

一.垃圾搜集算法

  • JVM中的內(nèi)存分配機(jī)制

    垃圾回收算法有標(biāo)記-清除算法,標(biāo)記-整理算法和復(fù)制算法,JVM使用分代收集算法來回收J(rèn)VM分配的內(nèi)存空間,分代收集算法分為新生代和老年代,主要收集JVM內(nèi)存模型中的堆內(nèi)存,其中新生代使用復(fù)制算法,老年代使用標(biāo)記-整理算法,下面探索下垃圾回收算法的具體思想。

  • 標(biāo)記-清除算法:
    標(biāo)記清除算法分為標(biāo)記和清除兩個(gè)階段,首先標(biāo)記出需要回收的內(nèi)存空間,在標(biāo)記完成后統(tǒng)一回收所有被標(biāo)記的對象。它的主要確定有兩個(gè):1.它的標(biāo)記和清除的效率都不高。2.它清除對象空間后會(huì)產(chǎn)生大量不連續(xù)的內(nèi)存碎片,使得再分配大對象(需要使用大量連續(xù)內(nèi)存的對象)時(shí)因內(nèi)存不足問題而提前觸發(fā)垃圾回收。它的回收過程如下圖所示。

java之分配和管理JVM內(nèi)存

  • 復(fù)制算法
    復(fù)制算法將內(nèi)存容量劃分為相等的兩塊,每次使用其中的一塊內(nèi)存,當(dāng)這塊內(nèi)存使用完了,就將這塊內(nèi)存中存活的對象復(fù)制到另一塊內(nèi)存中,然后清空這塊內(nèi)存空間,下次的對象分配到另一塊內(nèi)存空間中,也就是存儲(chǔ)的有對象的那塊,兩塊內(nèi)存空間交替使用。在JVM堆內(nèi)存中的新生代分為Eden空間,from survivor空間和to survivor空間。默認(rèn)Eden和survivor空間比例是8:1,其中Eden占80%,from 和 to 各占10%,所有新生代的內(nèi)存能夠利用的空間為90%。在新生代中,每次垃圾回收都會(huì)有大量的對象被回收掉,所以只需要復(fù)制存活的少數(shù)對象即可。下面是復(fù)制算法的操作過程:

java之分配和管理JVM內(nèi)存

  • 標(biāo)記-整理算法:
    復(fù)制算法在對象存活率較高的情況下并不好用,因?yàn)樗?jīng)過復(fù)制大量的存活對象。更關(guān)鍵的是,復(fù)制算法會(huì)有一些空間浪費(fèi)掉。因?yàn)槔夏甏4娴氖且恍┐婊钪芷诒容^長的對象,所以不適合使用復(fù)制算法。根據(jù)老年代的特點(diǎn),產(chǎn)生了標(biāo)記-整理算法。標(biāo)記-整理算法先標(biāo)記存活的對象,然后讓他們向一端移動(dòng),之后再釋放掉端邊界以外的對象內(nèi)存。標(biāo)記-整理算法執(zhí)行過程如下:

java之分配和管理JVM內(nèi)存

二.內(nèi)存分配和回收策略
java技術(shù)體系中所提倡的自動(dòng)內(nèi)存管理最終可以歸結(jié)為自動(dòng)化的給對象分配內(nèi)存以及回收分配給對象的內(nèi)存。關(guān)于回收內(nèi)存可以參考上面的垃圾收集算法,JVM采用分代垃圾回收算法來回收對象內(nèi)存,分為新生代和老年代,新生代使用復(fù)制算法,老年代使用標(biāo)記-整理算法。下面來看下JVM的內(nèi)存分配策略:

  • 對象優(yōu)先在Eden區(qū)分配
    大多數(shù)情況下,對象在新生代Eden區(qū)分配。當(dāng)Eden區(qū)沒有足夠的內(nèi)存空間進(jìn)行分配時(shí),虛擬機(jī)將發(fā)起一次Minor GC(新生代GC)來回收新生代中已經(jīng)死亡的對象,存活的對象存儲(chǔ)到survivor區(qū)中,如果survivor區(qū)沒有足夠的空間存儲(chǔ),將通過空間分配擔(dān)保直接存入老年代中。之后把對象存入Eden區(qū)。

  • 大對象直接進(jìn)入老年代
    大對象指的是需要大量連續(xù)內(nèi)存空間的對象,最典型的大對象為很長的字符串和很長的數(shù)組。大對象對虛擬機(jī)的內(nèi)存分配來說是一個(gè)壞消息,經(jīng)常出現(xiàn)大對象容易導(dǎo)致內(nèi)存還有不少空間時(shí)就提前觸發(fā)垃圾回收及產(chǎn)生連續(xù)的空間來存放大對象。不大對象更糟糕的情況是遇到一群“短命”的大對象,寫程序時(shí)應(yīng)避免。

  • 長期存活的對象進(jìn)入老年代
    既然虛擬機(jī)采用了分代收集的思想來管理內(nèi)存,那虛擬機(jī)就要知道哪些對象應(yīng)該放在新生代,哪些對象應(yīng)該放在老年代。虛擬機(jī)給每個(gè)對象了一個(gè)年齡計(jì)數(shù)器。如果這個(gè)對象在Eden區(qū)中經(jīng)歷了一此Minor GC,并存儲(chǔ)到了survivor區(qū)中,那這個(gè)對象的年齡為1,每熬過一次MinorGC,對象的年齡加1,當(dāng)他的年齡增加到一定程度(默認(rèn)是15歲),就會(huì)晉升到老年代中。

  • 動(dòng)態(tài)對象年齡判定
    為了能更好的適應(yīng)不同程序的內(nèi)存狀況,虛擬機(jī)并不總是只有在對象的年齡達(dá)到一定程度時(shí)才讓對象進(jìn)入老年代,如果在survivor空間的相同年齡的對象內(nèi)存總和大于survivor空間內(nèi)存的一半時(shí),大于等于這個(gè)年齡的對象將進(jìn)入老年代中。

  • 空間分配擔(dān)保
    老年代會(huì)為新生代的內(nèi)存分配做擔(dān)保,也就是說在進(jìn)行Minor GC之前,虛擬機(jī)會(huì)先檢查老年代的大連續(xù)可用內(nèi)存空間是否大于等于新生代所有對象總空間,如果大于等于,就說明這次Minor GC是安全的,因?yàn)镸inor GC后可能會(huì)出現(xiàn)把新生代對象存儲(chǔ)到老年代中的情況(當(dāng)Minor GC后surviror空間內(nèi)存不夠用時(shí)),如果這個(gè)條件不成立,那虛擬機(jī)會(huì)查看HandlePromotionFailure設(shè)置是否允許擔(dān)保失敗,允許的話,虛擬機(jī)會(huì)看老年代大連續(xù)可用空間的大小是否大于歷次晉升到老年代的對象平均大小,如果大于,虛擬機(jī)會(huì)嘗試進(jìn)行一次Minor GC。如果不允許擔(dān)保失敗,就會(huì)進(jìn)行Full GC(老年代GC)來回收老年代死亡對象的空間好讓老年代騰出更大的空間。

看完上訴內(nèi)容,你們掌握java分配和管理JVM內(nèi)存的方法了嗎?如果想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

分享標(biāo)題:java之分配和管理JVM內(nèi)存-創(chuàng)新互聯(lián)
分享地址:http://muchs.cn/article10/cosigo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)網(wǎng)站設(shè)計(jì)、域名注冊、自適應(yīng)網(wǎng)站、標(biāo)簽優(yōu)化、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司