您好,登錄后才能下訂單哦!
這篇文章主要為大家詳細介紹了java分配和管理JVM內存的方法,文中示例介紹的非常詳細,圖文詳解容易學習,非常適合初學者入門。
一.垃圾搜集算法
JVM中的內存分配機制
垃圾回收算法有標記-清除算法,標記-整理算法和復制算法,JVM使用分代收集算法來回收JVM分配的內存空間,分代收集算法分為新生代和老年代,主要收集JVM內存模型中的堆內存,其中新生代使用復制算法,老年代使用標記-整理算法,下面探索下垃圾回收算法的具體思想。
標記-清除算法:
標記清除算法分為標記和清除兩個階段,首先標記出需要回收的內存空間,在標記完成后統一回收所有被標記的對象。它的主要確定有兩個:1.它的標記和清除的效率都不高。2.它清除對象空間后會產生大量不連續的內存碎片,使得再分配大對象(需要使用大量連續內存的對象)時因內存不足問題而提前觸發垃圾回收。它的回收過程如下圖所示。
復制算法
復制算法將內存容量劃分為相等的兩塊,每次使用其中的一塊內存,當這塊內存使用完了,就將這塊內存中存活的對象復制到另一塊內存中,然后清空這塊內存空間,下次的對象分配到另一塊內存空間中,也就是存儲的有對象的那塊,兩塊內存空間交替使用。在JVM堆內存中的新生代分為Eden空間,from survivor空間和to survivor空間。默認Eden和survivor空間比例是8:1,其中Eden占80%,from 和 to 各占10%,所有新生代的內存能夠利用的空間為90%。在新生代中,每次垃圾回收都會有大量的對象被回收掉,所以只需要復制存活的少數對象即可。下面是復制算法的操作過程:
標記-整理算法:
復制算法在對象存活率較高的情況下并不好用,因為它要經過復制大量的存活對象。更關鍵的是,復制算法會有一些空間浪費掉。因為老年代保存的是一些存活周期比較長的對象,所以不適合使用復制算法。根據老年代的特點,產生了標記-整理算法。標記-整理算法先標記存活的對象,然后讓他們向一端移動,之后再釋放掉端邊界以外的對象內存。標記-整理算法執行過程如下:
二.內存分配和回收策略
java技術體系中所提倡的自動內存管理最終可以歸結為自動化的給對象分配內存以及回收分配給對象的內存。關于回收內存可以參考上面的垃圾收集算法,JVM采用分代垃圾回收算法來回收對象內存,分為新生代和老年代,新生代使用復制算法,老年代使用標記-整理算法。下面來看下JVM的內存分配策略:
對象優先在Eden區分配
大多數情況下,對象在新生代Eden區分配。當Eden區沒有足夠的內存空間進行分配時,虛擬機將發起一次Minor GC(新生代GC)來回收新生代中已經死亡的對象,存活的對象存儲到survivor區中,如果survivor區沒有足夠的空間存儲,將通過空間分配擔保直接存入老年代中。之后把對象存入Eden區。
大對象直接進入老年代
大對象指的是需要大量連續內存空間的對象,最典型的大對象為很長的字符串和很長的數組。大對象對虛擬機的內存分配來說是一個壞消息,經常出現大對象容易導致內存還有不少空間時就提前觸發垃圾回收及產生連續的空間來存放大對象。不大對象更糟糕的情況是遇到一群“短命”的大對象,寫程序時應避免。
長期存活的對象進入老年代
既然虛擬機采用了分代收集的思想來管理內存,那虛擬機就要知道哪些對象應該放在新生代,哪些對象應該放在老年代。虛擬機給每個對象了一個年齡計數器。如果這個對象在Eden區中經歷了一此Minor GC,并存儲到了survivor區中,那這個對象的年齡為1,每熬過一次MinorGC,對象的年齡加1,當他的年齡增加到一定程度(默認是15歲),就會晉升到老年代中。
動態對象年齡判定
為了能更好的適應不同程序的內存狀況,虛擬機并不總是只有在對象的年齡達到一定程度時才讓對象進入老年代,如果在survivor空間的相同年齡的對象內存總和大于survivor空間內存的一半時,大于等于這個年齡的對象將進入老年代中。
空間分配擔保
老年代會為新生代的內存分配做擔保,也就是說在進行Minor GC之前,虛擬機會先檢查老年代的最大連續可用內存空間是否大于等于新生代所有對象總空間,如果大于等于,就說明這次Minor GC是安全的,因為Minor GC后可能會出現把新生代對象存儲到老年代中的情況(當Minor GC后surviror空間內存不夠用時),如果這個條件不成立,那虛擬機會查看HandlePromotionFailure設置是否允許擔保失敗,允許的話,虛擬機會看老年代最大連續可用空間的大小是否大于歷次晉升到老年代的對象平均大小,如果大于,虛擬機會嘗試進行一次Minor GC。如果不允許擔保失敗,就會進行Full GC(老年代GC)來回收老年代死亡對象的空間好讓老年代騰出更大的空間。
看完上訴內容,你們掌握java分配和管理JVM內存的方法了嗎?如果想了解更多相關內容,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。