国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

深入理解Java虛擬機——內(nèi)存分配與回收策略

這篇具有很好參考價值的文章主要介紹了深入理解Java虛擬機——內(nèi)存分配與回收策略。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1.前言

在讀這篇博客之前,你需要了解分代收集理論中,收集器應該將Java堆劃分出不同的區(qū)域**,**然后將回收對象依據(jù)其年齡(年齡即對象熬過垃圾收集過程的次數(shù))分配到不同的區(qū)域之中存儲。

例如appel式回收,HotSpot虛擬機中的新生代收集器都采用了appel式回收來設計新生代內(nèi)存布局。

Appel式回收的具體做法是把新生代分為一塊較大的Eden空間和兩塊較小的 Survivor空間,每次分配內(nèi)存只使用Eden和其中一塊Survivor。發(fā)生垃圾收集時,將Eden和Survivor中仍然存活的對象一次性復制到另外一塊Survivor空間上,然后直接清理掉Eden和已用過的那塊Survivor空間。HotSpot虛擬機默認Eden和Survivor的大小比例是8∶1,也即每次新生代中可用內(nèi)存空間為整個新 生代容量的90%(Eden的80%加上一個Survivor的10%),只有一個Survivor空間,即10%的新生代是會 被“浪費”的。當然,98%的對象可被回收僅僅是“普通場景”下測得的數(shù)據(jù),任何人都沒有辦法百分百 保證每次回收都只有不多于10%的對象存活,因此Appel式回收還有一個充當罕見情況的“逃生門”的安 全設計,當Survivor空間不足以容納一次Minor GC之后存活的對象時,就需要依賴其他內(nèi)存區(qū)域(實際上大多就是老年代)進行分配擔保(Handle Promotion)。

所謂分配擔保就是:如果另外一塊 Survivor空間沒有足夠空間存放上一次新生代收集下來的存活對象這些對象便將通過分配擔保機制直 接進入老年代,這對虛擬機來說就是安全的

深入理解Java虛擬機——內(nèi)存分配與回收策略

在將Java堆內(nèi)存劃分為不同的區(qū)域之后,垃圾收集器才可以每次只回收其中某一個或者某些部分的區(qū)域(Minor GC、Major GC、Full GC)。進而演化出與對象存亡特征相匹配的垃圾收集算法。

2.正文

1.對象優(yōu)先在Eden區(qū)分配

大多數(shù)情況下,對象在新生代Eden區(qū)中分配,當Eden區(qū)沒有足夠空間進分配時,虛擬機將發(fā)起一次MinorGC

2.大對象直接進入老年代

大對象指的是需要大量連續(xù)內(nèi)存空間的對象,比如一個很長的字符串或者是一個很大的數(shù)組。

大對象對虛擬機的內(nèi)存分配來說就是一個不折不扣的壞消息,比遇到一個大對象更加壞的消息就是遇到一群“朝生夕滅”的“短命大對象”,我們寫程序的時候應注意避免。在Java虛擬機中要避免大對象的原因是,在分配空間時,它容易導致內(nèi)存明明還有不少空間時就提前觸發(fā)垃圾收集,以獲取足夠的連續(xù)空間才能安置好它們,而當復制對象時大對象就意味著高額的內(nèi)存復制開銷。

HotSpot虛擬機提供了 -XX:PretenureSizeThreshold 參數(shù),指定大于該設置值的對象直接在老年代分配,這樣做的目的就是避免在Eden區(qū)及兩個Survivor區(qū)之間來回復制,產(chǎn)生大量的內(nèi)存復制操作。

3.長期存活的對象將進入老年代

在前面我們了解了對象的創(chuàng)建過程中,會設置對象頭,其中對象頭中就包含了對象的年齡。

對象通常在Eden區(qū)里誕生,如果經(jīng)過第一次 Minor GC后仍然存活,并且能被Survivor容納的話,該對象會被移動到Survivor空間中,并且將其對象年齡設為1歲。對象在Survivor區(qū)中每熬過一次Minor GC,年齡就增加1歲,當它的年齡增加到一定程度(默認為15),就會被晉升到老年代中。

對象晉升老年代的年齡閾值,可以通過參數(shù)-XX: MaxTenuringThreshold設置。

4.動態(tài)對象年齡判斷

為了能更好地適應不同程序的內(nèi)存狀況,HotSpot虛擬機并不是永遠要求對象的年齡必須達到 -XX:MaxTenuringThreshold 才能晉升老年代,如果在Survivor空間中相同年齡所有對象大小的總和大于Survivor空間的一半,年齡大于或等于該年齡的對象就可以直接進入老年代,無須等到 -XX:MaxTenuringThreshold 中要求的年齡。

5.空間分配擔保

在發(fā)生Minor GC之前,虛擬機必須先檢查老年代最大可用的連續(xù)空間是否大于新生代所有對象總空間,如果這個條件成立,那這一次Minor GC可以確保是安全的。如果不成立,則虛擬機會先查看 -XX:HandlePromotionFailure 參數(shù)的設置值是否允許擔保失?。℉andle Promotion Failure)。

-XX:HandlePromotionFailure=true代表允許擔保失敗;-XX:HandlePromotionFailure=false代表不允許擔保失敗

如果允許,那會繼續(xù)檢查老年代最大可用的連續(xù)空間是否大于歷次晉升到老年代對象的平均大小,如果大于,將嘗試進行一次Minor GC,盡管這次Minor GC是有風險的;如果小于,或者 -XX:HandlePromotionFailure 設置不允許冒險,那這時就要改為進行一次Full GC。

深入理解Java虛擬機——內(nèi)存分配與回收策略

所謂冒險,在允許擔保失敗的情況下,將Survivor無法存放的存活對象,由老年代進行分配擔保,這個步驟是有一定風險的。因為新生代中會有多少對象將發(fā)生晉升(新生代—>老年代)我們無法知道。

  • 如果老年代中有足夠的空間來容納新生代中所有對象(最壞的情況,所有新生代對象都晉升),那么這種情況相對來說安全的多。
  • 如果是老年代沒有足夠的空間來容納新生代中所有對象,且我們無法知道有多少新生代對象發(fā)生晉升。簡單來說就是我們無法確定老年代是否有足夠的空間存放新生代中晉升的對象,我們只能以歷史平均晉升值作為參考,那么這種情況就可能會發(fā)生擔保失敗。

取歷史平均值來比較其實仍然是一種賭概率的解決辦法,也就是說假如某次Minor GC存活后的對象突增,遠遠高于歷史平均值的話,依然會導致?lián)J?。如果出現(xiàn)了擔保失敗,那就只好老老實實 地重新發(fā)起一次Full GC,這樣停頓時間就很長了。雖然擔保失敗時繞的圈子是最大的,但通常情況下都還是會將-XX:HandlePromotionFailure開關(guān)打開,避免Full GC過于頻繁。
會將**-XX:HandlePromotionFailure開關(guān)打開,避免Full GC過于頻繁。

注意:該參數(shù)JDK1.7以后就廢棄了, 只要老年代的連續(xù)空間大于新生代對象的總大小或者歷次晉升到老年代的對象的平均大小就進行MinorGC,否則Fu11GC

本文參考自《深入理解Java虛擬機》(第三版)文章來源地址http://www.zghlxwxcb.cn/news/detail-439688.html

到了這里,關(guān)于深入理解Java虛擬機——內(nèi)存分配與回收策略的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • [AIGC] 深入理解 Java 虛擬機(JVM)的垃圾回收

    [AIGC] 深入理解 Java 虛擬機(JVM)的垃圾回收

    一、是什么 Java 虛擬機(JVM)的垃圾回收(Garbage Collection)是一種自動內(nèi)存管理機制,用于釋放不再使用的對象所占用的內(nèi)存空間。垃圾回收的目標是回收那些不再被程序引用的對象,以避免內(nèi)存泄漏和內(nèi)存溢出等問題。 二、為什么需要垃圾回收 在 Java 程序中,對象的創(chuàng)建

    2024年02月21日
    瀏覽(16)
  • 深入探討Java虛擬機(JVM):執(zhí)行流程、內(nèi)存管理和垃圾回收機制

    深入探討Java虛擬機(JVM):執(zhí)行流程、內(nèi)存管理和垃圾回收機制

    目錄 什么是JVM? JVM 執(zhí)行流程 JVM 運行時數(shù)據(jù)區(qū) 堆(線程共享) Java虛擬機棧(線程私有) 什么是線程私有? 程序計數(shù)器(線程私有) 方法區(qū)(線程共享) JDK 1.8 元空間的變化 運行時常量池 內(nèi)存布局中的異常問題 1.? Java堆溢出 2.??虛擬機棧和本地方法棧溢出 JVM 類加載 1.

    2024年02月09日
    瀏覽(27)
  • Java虛擬機(JVM)垃圾收集器、新生代、老年代、永久代以及內(nèi)存分配策略

    Java虛擬機(JVM)垃圾收集器、新生代、老年代、永久代以及內(nèi)存分配策略

    在 Java 中,堆被劃分成兩個不同的區(qū)域:新生代 ( Young )、老年代 ( Old )。而新生代 ( Young ) 又被劃分為三個區(qū)域:Eden、From Survivor、To Survivor。這樣劃分的目的是為了使 JVM 能夠更好的管理堆內(nèi)存中的對象,包括內(nèi)存的分配以及回收。 新生代中一般保存新出現(xiàn)的對象,所以每次

    2024年02月04日
    瀏覽(27)
  • 深入理解Java虛擬機(二)Java內(nèi)存區(qū)域與內(nèi)存溢出異常

    深入理解Java虛擬機(二)Java內(nèi)存區(qū)域與內(nèi)存溢出異常

    ????????對于Java程序員來說,在虛擬機自動內(nèi)存管理機制的幫助下,不再需要為每一個new操作去寫配對的delete/free代碼,不容易出現(xiàn)內(nèi)存泄漏和內(nèi)存溢出問題,看起來由虛擬機管理內(nèi)存一切都很美好。不過,也正是因為Java程序員把控制內(nèi)存的權(quán)力交給了Java虛擬機,一旦出

    2024年02月16日
    瀏覽(21)
  • 《深入理解Java虛擬機》讀書筆記:Java內(nèi)存區(qū)域

    《深入理解Java虛擬機》讀書筆記:Java內(nèi)存區(qū)域

    Java內(nèi)存區(qū)域包含程序計數(shù)器、虛擬機棧、本地方法棧、Java堆、方法區(qū)五個區(qū)域。 運行時數(shù)據(jù)區(qū)分類 ? Java內(nèi)存區(qū)域 ? 程序計數(shù)器(Program Counter Register)是一塊較小的內(nèi)存空間,它可以看作是當前線程所執(zhí)行的字節(jié)碼的信號指示器。 字節(jié)碼解釋器工作時就是通過改變這個計數(shù)

    2024年02月14日
    瀏覽(30)
  • 深入理解Java虛擬機jvm-對象的內(nèi)存布局

    深入理解Java虛擬機jvm-對象的內(nèi)存布局

    在HotSpot虛擬機里,對象在堆內(nèi)存中的存儲布局可以劃分為三個部分:對象頭(Header)、實例 數(shù)據(jù)(Instance Data)和對齊填充(Padding)。 HotSpot虛擬機對象的對象頭部分包括兩類信息。第一類是用于存儲對象自身的運行時數(shù)據(jù),如哈 希碼(HashCode)、GC分代年齡、鎖狀態(tài)標志、

    2024年02月09日
    瀏覽(17)
  • 深入理解 slab cache 內(nèi)存分配全鏈路實現(xiàn)

    深入理解 slab cache 內(nèi)存分配全鏈路實現(xiàn)

    本文源碼部分基于內(nèi)核 5.4 版本討論 在經(jīng)過上篇文章 《從內(nèi)核源碼看 slab 內(nèi)存池的創(chuàng)建初始化流程》 的介紹之后,我們最終得到下面這幅 slab cache 的完整架構(gòu)圖: 本文筆者將帶大家繼續(xù)從內(nèi)核源碼的角度繼續(xù)拆解 slab cache 的實現(xiàn)細節(jié),接下來筆者會基于上面這幅 slab cache 完

    2024年02月02日
    瀏覽(22)
  • Python內(nèi)存管理與垃圾回收機制:深入理解與優(yōu)化【第138篇—RESTful API】

    Python內(nèi)存管理與垃圾回收機制:深入理解與優(yōu)化【第138篇—RESTful API】

    前些天發(fā)現(xiàn)了一個巨牛的人工智能學習網(wǎng)站,通俗易懂,風趣幽默,忍不住分享一下給大家?!军c擊進入巨牛的人工智能學習網(wǎng)站】。 在Python編程中,內(nèi)存管理與垃圾回收機制是至關(guān)重要的主題。了解Python如何管理內(nèi)存和處理垃圾回收對于編寫高效、穩(wěn)定的程序至關(guān)重要。本

    2024年03月18日
    瀏覽(21)
  • Java垃圾回收機制深入理解

    Java垃圾回收機制深入理解

    Java垃圾回收機制是Java虛擬機(JVM)的核心組件之一,對于內(nèi)存管理起到至關(guān)重要的作用。它能自動追蹤并管理應用程序中創(chuàng)建的對象,當這些對象不再使用時,垃圾回收機制會自動回收其占用的內(nèi)存,使這部分內(nèi)存能夠被再次利用。此機制極大地減少了開發(fā)者需要手動管理

    2024年02月09日
    瀏覽(19)
  • 深入理解Linux虛擬內(nèi)存管理

    深入理解Linux虛擬內(nèi)存管理

    Linux 內(nèi)核設計與實現(xiàn) 深入理解 Linux 內(nèi)核 Linux 設備驅(qū)動程序 Linux設備驅(qū)動開發(fā)詳解 深入理解Linux虛擬內(nèi)存管理(一) 深入理解Linux虛擬內(nèi)存管理(二) 深入理解Linux虛擬內(nèi)存管理(三) 深入理解Linux虛擬內(nèi)存管理(四) 深入理解Linux虛擬內(nèi)存管理(五) 深入理解Linux虛擬內(nèi)存

    2024年02月06日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包