真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

成都創(chuàng)新互聯(lián)公司從2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都做網(wǎng)站、網(wǎng)站設(shè)計網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元華寧做網(wǎng)站,已為上家服務(wù),為華寧各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792

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

一.垃圾搜集算法

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

    垃圾回收算法有標(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)記和清除兩個階段,首先標(biāo)記出需要回收的內(nèi)存空間,在標(biāo)記完成后統(tǒng)一回收所有被標(biāo)記的對象。它的主要確定有兩個:1.它的標(biāo)記和清除的效率都不高。2.它清除對象空間后會產(chǎn)生大量不連續(xù)的內(nèi)存碎片,使得再分配大對象(需要使用大量連續(xù)內(nèi)存的對象)時因內(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)存空間中,也就是存儲的有對象的那塊,兩塊內(nèi)存空間交替使用。在JVM堆內(nèi)存中的新生代分為Eden空間,from survivor空間和to survivor空間。默認(rèn)Eden和survivor空間比例是8:1,其中Eden占80%,from 和 to 各占10%,所有新生代的內(nèi)存能夠利用的空間為90%。在新生代中,每次垃圾回收都會有大量的對象被回收掉,所以只需要復(fù)制存活的少數(shù)對象即可。下面是復(fù)制算法的操作過程:

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

  • 標(biāo)記-整理算法:
    復(fù)制算法在對象存活率較高的情況下并不好用,因為它要經(jīng)過復(fù)制大量的存活對象。更關(guān)鍵的是,復(fù)制算法會有一些空間浪費掉。因為老年代保存的是一些存活周期比較長的對象,所以不適合使用復(fù)制算法。根據(jù)老年代的特點,產(chǎn)生了標(biāo)記-整理算法。標(biāo)記-整理算法先標(biāo)記存活的對象,然后讓他們向一端移動,之后再釋放掉端邊界以外的對象內(nèi)存。標(biāo)記-整理算法執(zhí)行過程如下:

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

二.內(nèi)存分配和回收策略
java技術(shù)體系中所提倡的自動內(nèi)存管理最終可以歸結(jié)為自動化的給對象分配內(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)行分配時,虛擬機將發(fā)起一次Minor GC(新生代GC)來回收新生代中已經(jīng)死亡的對象,存活的對象存儲到survivor區(qū)中,如果survivor區(qū)沒有足夠的空間存儲,將通過空間分配擔(dān)保直接存入老年代中。之后把對象存入Eden區(qū)。

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

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

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

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

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


分享標(biāo)題:java之分配和管理JVM內(nèi)存
URL標(biāo)題:http://weahome.cn/article/gdjcpe.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部