1. 程式人生 > >java虛擬機器-記憶體分配與回收策略

java虛擬機器-記憶體分配與回收策略

1.物件優先在Eden分配
大多數情況下,物件在新生代Eden區分配。當Eden區沒有足夠空間進行分配時,虛擬機器將發起一次Minor GC。
虛擬機器提供了-XX:+PrintGCDetails這個收集器日誌引數,告訴虛擬機器在傳送垃圾收集行為時列印記憶體回收日誌,並且在程序退出的時候輸出當前的記憶體區域分配情況。

2.大物件直接進入老年代

所謂的大物件是指,需要大量連續記憶體空間的java物件,最典型的大物件就是那種很長的字串以及陣列。大物件對虛擬機器的記憶體分配來說就是一個壞訊息(比遇到一個大物件更壞的訊息就是遇到一群“朝生夕滅”的“短命大物件”,寫程式的時候應該避免),經常出現大物件容易導致記憶體還有不少空間時就提前觸發垃圾收集以獲取足夠的連續空間來“安置”他們。
虛擬機器提供了一個-XX:PretenureSizeThreshold引數,令大於這個設定值的物件直接在老年代分配。這樣做的目的是避免在Eden區及兩個Survivor區之間發生大量的記憶體複製。

3.長期存活的物件將進入老年代

既然虛擬機器採用了分代收集的思想來管理記憶體,那麼記憶體回收時就必須能識別哪些物件應發在新生代,哪些物件應放在老年代。為了做到這一點,虛擬機器給每個物件定義了一個物件年齡(Age)計數器。如果物件在Eden出生並經過第一次Minor GC後仍然存活,並且能被Survivor容納的話,將被移動到Survivor空間中,並且物件年齡設為1.物件在Survivor區中每“熬過”一次Minor GC,年齡就增加一歲,當它的年齡增加到一定程度(預設15歲),就將會被晉升到老年代。物件晉升老年代的年齡閾值,可以通過引數-XX:MaxTenuringThreshold設定。

4.動態物件年齡判定
為了能更好的適應不同程式的記憶體狀況,虛擬機器並不是永遠的要求物件的年齡必須達到MaxTenuringThreshold才能晉升老年代,如果在Survivor空間中相同年齡所有物件大小的總和大於Survivor空間的一半,年齡大於或等於該年齡的物件就可以直接進入老年代,無需等到MaxTenuringThreshold中要求的年齡。

5.空間分配擔保

在發生Minor GC之前,虛擬機器會先檢查老年代最大可用的連續空間是否大於新生代所有物件總空間,如果這個條件成立,那麼Minor GC可以確保是安全的。如果不成立,則虛擬機器會檢視HandlePromotionFailure設定值是否允許擔保失敗。如果允許,那麼會繼續檢查老年代最大可用的連續空間是否大於歷次晉升到老年代物件的平均大小,如果大於,將嘗試進行一次Minor GC,儘管這次Minor GC是有風險的;如果小於或者HandlePromotionFailure設定為不允許冒險,那這時也要改為進行一次Full GC.

相關推薦

java虛擬機器-記憶體分配回收策略

1.物件優先在Eden分配 大多數情況下,物件在新生代Eden區分配。當Eden區沒有足夠空間進行分配時,虛擬機器將發起一次Minor GC。 虛擬機器提供了-XX:+PrintGCDetails這個收集器日誌引數,告訴虛擬機器在傳送垃圾收集行為時列印記憶體回收日誌,並且在

Java虛擬機器(三):記憶體分配回收策略

[GC[DefNew Desired survivor size 524288 bytes, new threshold 1 (max 1) - age 1: 748104 bytes, 748104 total : 5024K->730K(9216K), 0.0038710 sec

Java虛擬機器 記憶體管理垃圾回收

java和C++之間有一堵由記憶體自動分配與垃圾回收所圍成的高牆,外面的人想進來,裡面的人想出去 主要內容 記憶體分佈 垃圾回收機制 垃圾收集器 Java記憶體分佈 當java虛擬機器執行程式時,會把由虛擬機器管理的記憶體劃分為不同的區域,他們的作用不同,建立和銷燬時間也不同,有的是虛擬

Java虛擬機器記憶體分配機制啟動引數說明

-Xms :表示java虛擬機器堆區記憶體初始記憶體分配的大小,通常為作業系統可用記憶體的1/64大小即可,但仍需按照實際情況進行分配。-Xmx: 表示java虛擬機器堆區記憶體可被分配的最大上限,通常為作業系統可用記憶體的1/4大小。但是開發過程中,通常會將 -Xms 與 -Xmx兩個引數的配置相同的值,其

探祕Java虛擬機器——記憶體管理垃圾回收

本文主要是基於Sun JDK 1.6 Garbage Collector(作者:畢玄)的整理與總結,原文請讀者在網上搜索。 1、Java虛擬機器執行時的資料區 2、常用的記憶體區域調節引數 -Xms:初始堆大小,預設為實體記憶體的1/64(<1GB);預設(MinHeapFreeRatio引數可以調

java虛擬機器記憶體分配之新生代老年代GC

1. Java堆中各代分佈: 圖1:Java堆中各代分佈 Young:主要是用來存放新生的物件。 Old:主要存放應用程式中生命週期長的記憶體物件。 Permanent:是指記憶體的永久儲存區域,主要存放Class和Meta的資訊,Class在被 Load的時候被放入PermGen space區域. 它和

Java虛擬機器記憶體模型執行緒

Java虛擬機器—記憶體模型與執行緒 Lyon Keep balance,Be a better man! ​關注他 3 人讚了該文章 前言: 本文主要介紹Java的記憶體模型和Java執行緒。 Java記憶體模型的主要目標是定義程式中各個變數的訪問規則,即在JVM

垃圾收集器記憶體分配策略(六)——記憶體分配回收策略

物件的記憶體分配,往大方向上講,就是在堆上分配(但也可能經過JIT編譯後被拆散為標量型別並間接地棧上分配),物件主要分配在新生代的Eden區上,如果啟動了本地執行緒分配緩衝,將按執行緒優先在TLAB上分配。少數情況下也可能會直接分配在老年代中,分配的規則並不是百分之百固定的,

JVM:GC-記憶體分配回收策略

物件優先在Eden區分配 物件優先在eden區分配,當eden區沒有足夠空間分配記憶體時,就會發現minor gc. 程式碼例項: public class Main { static int _1M = 1024*1024; //vm 引數 // -ver

JVM六:記憶體分配回收策略

對於物件的回收,前面以及講過具體的回收機制,下面我們來看看物件的分配策略! ①物件優先在Eden區域分配 大多數情況下,物件在新生代Eden區分配。當Eden區沒有足夠空間進行分配時,虛擬機器將發起一次Minor GC。 虛擬機器提供了-XX:PrintGCDetails這個收集日誌引數

JVM之記憶體分配回收策略

JVM之記憶體分配與回收策略 來源 https://www.cnblogs.com/xiaoxi/p/6557473.html   JVM分代垃圾回收策略的基礎概念 來源 https://www.cnblogs.com/xiaoxi/p/6602166.html 一、為

Java JVM】Java虛擬機器記憶體分配幾個原則

1、大多數情況下,物件在新生代Eden區中分配。當Eden區沒有足夠空間進行分配時,虛擬機器將發起一次Minor GC 2、大物件直接進入老年代。大物件指需要大量連續記憶體空間的Java物件,最典型的

java虛擬機器記憶體分配原理概述

本文主要介紹在應用發起記憶體申請,到作業系統最終分配記憶體,採用了那些途徑和方法,並比較各種方法的優劣以及使用過程中應該注意那些點。 注意本文都是概述,如想詳細瞭解,需單獨詳細瞭解每一部分內容 1、應用在那些情況下發起記憶體申請 2、記憶體發起申請的步驟(

深入理解Java虛擬機器--記憶體分配規則

新生代GC(Minor GC):指發生在新生代的垃圾回收動作,因此區域物件大多朝生夕死,所以Minor GC非常頻繁,一般回収速度也比較快 老年代GC(Major GC/Full GC):指發生在老年

記憶體分配回收策略(五)

回收策略: Minor GC Major GC/Full GC Minor GC:發生在新生代的GC,發生非常頻繁,消耗時間短。 Major GC:發生在老年代GC,消耗時間一般為新生代GC的10倍,甚至更多(1000倍)。 Full GC:新生代+老年代 GC。

記憶體分配回收策略

物件的記憶體分配,往大方向上講,就是在堆上分配(但也可能經過JIT編譯後被拆散為標量型別並間接的在棧上分配),物件主要分配在新生代的Eden區上,如果啟動了本地執行緒分配緩衝,將按執行緒優先在TLAB上分配。少數情況下也可能會直接分配在老年代中,分配的規則

JVM 記憶體分配回收策略

Java 中,物件的記憶體分配,大的方向講,就是在堆上分配。物件主要分配在新生代的eden區上。 記憶體分配規則: 大多數情況,記憶體在新生代eden區中分配,當eden區沒有足夠空間進行分配的時候,虛擬機器將發起一次minor GC 大物件直接

JVM_8_記憶體分配回收策略

記憶體分配與回收策略 參考資料: 《Java虛擬機器垃圾回收(四) 總結:記憶體分配與回收策略 方法區垃圾回收 以及 JVM垃圾回收的調優方法》 在之前看"分代收集演算法"的時候,我們知道目前幾乎所有商業虛擬機器的垃圾收集器都採用分代收集演算法,對於Hotspot虛擬機

JVM記憶體分配回收策略

記憶體分配與回收策略 新生代GC(Minor GC):回收新生代,因為新生代物件存活時間很短,因此 Minor G

JVM垃圾回收器、記憶體分配回收策略

新生代垃圾收集器 1. Serial收集器 serial收集器即序列收集器,是一個單執行緒收集器。 序列收集器在進行垃圾回收時只使用一個CPU或一條收集執行緒去完成垃圾回收工作,並且會暫停其他的工作執行緒(stop the world),直至回收完成。適用於執行在client模式下的JVM。 在單CPU年代,