搜尋
首頁Javajava教程Java記憶體管理:分配與回收策略詳解

Java記憶體管理:分配與回收策略詳解

Java記憶體管理:分配與回收策略詳解

表3-4 垃圾收集相關的常用參數    加上-XX: UseSerialGC

Java記憶體管理:分配與回收策略詳解

Java記憶體管理:分配與回收策略詳解

Java記憶體管理:分配與回收策略詳解

物件的記憶體分配,從概念上講,應該都是在堆上分配(而實際上也有可能經過即時編譯後被拆散為標量類型並間接地在堆疊上分配[1] )。在經典分代的設計下,新生物件通常會分配在新生代中,少數情況下(例如物件大小超過一定閾值)也可能會直接分配在老年代。物件分配的規則並不是固定的,《Java虛擬機器規格》並未規定新物件的建立和儲存細節,這取決於虛擬機器目前使用的是哪一種垃圾收集器,以及虛擬機器中與記憶體相關的參數的設定。

物件優先在Eden分配

大多數情況下,物件在新生代Eden區中分配。當Eden區沒有足夠空間進行分配時,虛擬機器將發起一次Minor GC。

大物件直接進入老年代

大物件就是指需要大量連續記憶體空間的Java對象,最典型的大物件就是那種很長的字符串,或元素數量很龐大的數組,本節例子中的byte[]數組就是典型的大物件。大物件對虛擬機器的記憶體分配來說就是一個不折不扣的壞消息,比遇到一個大物件更加壞的消息就是遇到一群“朝生夕滅”的“短命大物件”,我們寫程式的時候應注意避免。

Java虛擬機器中要避免大物件的原因是,在分配空間時,它容易導致內存明明還有不少空間時就提前觸發垃圾收集,以獲取足夠的連續空間才能安置好它們,而當複

制物件時,大物件就意味著高額的記憶體複製開銷。 HotSpot虛擬機器提供了-XX:PretenureSizeThreshold參數,指定大於該設定值的物件直接在老年代分配,這樣做的目的就是避免在Eden區及兩個Survivor區之間來回復制,產生大量的記憶體複製操作。

-XX:PretenureSizeThreshold參數只對Serial和ParNew兩款新生代收集器有效,HotSpot的其他新生代收集器,如Parallel Scavenge並不支援這個參數。如果必須使用此參數進行調優,可考慮ParNew加CMS的收集器組合。

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

虛擬機為每個物件定義了一個物件年齡(Age)計數器,儲存在物件頭中,每熬過一次Minor GC,年齡就增加1歲,當它的年齡增加到一定程

度(預設為15),就會晉升到老年代。物件晉升老年代的年齡閾值,可以透過參數-XX:MaxTenuringThreshold設定。

動態物件年齡判定

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

空間分配擔保

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

在JDK 6 Update 24之後,這個測試結果就有了差異,-XX:HandlePromotionFailure參數不會再影響到虛擬機器的空間分配擔保策略,觀察OpenJDK中的源碼變化(見代碼清單3 -12),雖然原始碼中也定義了-XX:HandlePromotionFailure參數,但在實際虛擬機器中已經不會再使用它。 JDK 6 Update 24之後的規則變成只要老年代的連續空間大於新生代物件總大小或歷次晉升的平均大小,就會進行Minor GC,否則將進行Full GC。

以上是Java記憶體管理:分配與回收策略詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
JVM性能與其他語言JVM性能與其他語言May 14, 2025 am 12:16 AM

JVM'SperformanceIsCompetitiveWithOtherRuntimes,operingabalanceOfspeed,安全性和生產性。 1)JVMUSESJITCOMPILATIONFORDYNAMICOPTIMIZAIZATIONS.2)c提供NativePernativePerformanceButlanceButlactsjvm'ssafetyFeatures.3)

Java平台獨立性:使用示例Java平台獨立性:使用示例May 14, 2025 am 12:14 AM

JavaachievesPlatFormIndependencEthroughTheJavavIrtualMachine(JVM),允許CodeTorunonAnyPlatFormWithAjvm.1)codeisscompiledIntobytecode,notmachine-specificodificcode.2)bytecodeisisteredbytheybytheybytheybythejvm,enablingcross-platerssectectectectectross-eenablingcrossectectectectectection.2)

JVM架構:深入研究Java虛擬機JVM架構:深入研究Java虛擬機May 14, 2025 am 12:12 AM

TheJVMisanabstractcomputingmachinecrucialforrunningJavaprogramsduetoitsplatform-independentarchitecture.Itincludes:1)ClassLoaderforloadingclasses,2)RuntimeDataAreafordatastorage,3)ExecutionEnginewithInterpreter,JITCompiler,andGarbageCollectorforbytec

JVM:JVM與操作系統有關嗎?JVM:JVM與操作系統有關嗎?May 14, 2025 am 12:11 AM

JVMhasacloserelationshipwiththeOSasittranslatesJavabytecodeintomachine-specificinstructions,managesmemory,andhandlesgarbagecollection.ThisrelationshipallowsJavatorunonvariousOSenvironments,butitalsopresentschallengeslikedifferentJVMbehaviorsandOS-spe

Java:寫一次,在任何地方跑步(WORA) - 深入了解平台獨立性Java:寫一次,在任何地方跑步(WORA) - 深入了解平台獨立性May 14, 2025 am 12:05 AM

Java實現“一次編寫,到處運行”通過編譯成字節碼並在Java虛擬機(JVM)上運行。 1)編寫Java代碼並編譯成字節碼。 2)字節碼在任何安裝了JVM的平台上運行。 3)使用Java原生接口(JNI)處理平台特定功能。儘管存在挑戰,如JVM一致性和平台特定庫的使用,但WORA大大提高了開發效率和部署靈活性。

Java平台獨立性:與不同的操作系統的兼容性Java平台獨立性:與不同的操作系統的兼容性May 13, 2025 am 12:11 AM

JavaachievesPlatFormIndependencethroughTheJavavIrtualMachine(JVM),允許Codetorunondifferentoperatingsystemsswithoutmodification.thejvmcompilesjavacodeintoplatform-interploplatform-interpectentbybyteentbytybyteentbybytecode,whatittheninternterninterpretsandectectececutesoneonthepecificos,atrafficteyos,Afferctinginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginging

什麼功能使Java仍然強大什麼功能使Java仍然強大May 13, 2025 am 12:05 AM

JavaispoperfulduetoitsplatFormitiondence,對象與偏見,RichstandardLibrary,PerformanceCapabilities和StrongsecurityFeatures.1)Platform-dimplighandependectionceallowsenceallowsenceallowsenceallowsencationSapplicationStornanyDevicesupportingJava.2)

頂級Java功能:開發人員的綜合指南頂級Java功能:開發人員的綜合指南May 13, 2025 am 12:04 AM

Java的頂級功能包括:1)面向對象編程,支持多態性,提升代碼的靈活性和可維護性;2)異常處理機制,通過try-catch-finally塊提高代碼的魯棒性;3)垃圾回收,簡化內存管理;4)泛型,增強類型安全性;5)ambda表達式和函數式編程,使代碼更簡潔和表達性強;6)豐富的標準庫,提供優化過的數據結構和算法。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)