偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

JVM學(xué)習(xí)--對(duì)象內(nèi)存的分配策略

存儲(chǔ) 存儲(chǔ)軟件
在Java虛擬機(jī)的五塊內(nèi)存空間中,程序計(jì)數(shù)器、Java虛擬機(jī)棧、本地方法棧內(nèi)存的分配和回收都具有確定性,一般在編譯階段就能確定需要分配的內(nèi)存大小,并且由于都是線程私有,因此它們的內(nèi)存空間都隨著線程的創(chuàng)建而創(chuàng)建,線程的結(jié)束而回收。

Java所承諾的自動(dòng)內(nèi)存管理主要是針對(duì)對(duì)象內(nèi)存的回收和對(duì)象內(nèi)存的分配。

在Java虛擬機(jī)的五塊內(nèi)存空間中,程序計(jì)數(shù)器、Java虛擬機(jī)棧、本地方法棧內(nèi)存的分配和回收都具有確定性,一般在編譯階段就能確定需要分配的內(nèi)存大小,并且由于都是線程私有,因此它們的內(nèi)存空間都隨著線程的創(chuàng)建而創(chuàng)建,線程的結(jié)束而回收。也就是這三個(gè)區(qū)域的內(nèi)存分配和回收都具有確定性,垃圾回收器不需要在這里花費(fèi)太大的精力。

而Java虛擬機(jī)中的方法區(qū)因?yàn)槭怯脕泶鎯?chǔ)類信息、常量、靜態(tài)變量,這些數(shù)據(jù)的變動(dòng)性較小,因此不是Java內(nèi)存管理重點(diǎn)需要關(guān)注的區(qū)域。

[[225094]]

而對(duì)于堆,所有線程共享,所有的對(duì)象都需要在堆中創(chuàng)建和回收。雖然每個(gè)對(duì)象的大小在類加載的時(shí)候就能確定,但對(duì)象的數(shù)量只有在程序運(yùn)行期間才能確定,因此堆中內(nèi)存的分配具有較大的不確定性。此外,對(duì)象的生命周期長(zhǎng)短不一,因此需要針對(duì)不同生命周期的對(duì)象采用不同的內(nèi)存回收算法,增加了內(nèi)存回收的復(fù)雜性。

綜上所述:Java自動(dòng)內(nèi)存管理最核心的功能是堆內(nèi)存中對(duì)象的分配與回收。 

對(duì)象優(yōu)先在Eden區(qū)中分配

目前主流的垃圾收集器都會(huì)采用分代回收算法,因此需要將堆內(nèi)存分為新生代和老年代。

在新生代中為了防止內(nèi)存碎片問題,因此垃圾收集器一般都選用“復(fù)制”算法。因此,堆內(nèi)存的新生代被進(jìn)一步分為:Eden區(qū)+Survior1區(qū)+Survior2區(qū)。

每次創(chuàng)建對(duì)象時(shí),首先會(huì)在Eden區(qū)中分配。 

若Eden區(qū)已滿,則在Survior1區(qū)中分配。 

若Eden區(qū)+Survior1區(qū)剩余內(nèi)存太少,導(dǎo)致對(duì)象無法放入該區(qū)域時(shí),就會(huì)啟用“分配擔(dān)保”,將當(dāng)前Eden區(qū)+Survior1區(qū)中的對(duì)象轉(zhuǎn)移到老年代中,然后再將新對(duì)象存入Eden區(qū)。 

大對(duì)象直接進(jìn)入老年代

所謂“大對(duì)象”就是指一個(gè)占用大量連續(xù)存儲(chǔ)空間的對(duì)象,如數(shù)組。

當(dāng)發(fā)現(xiàn)一個(gè)大對(duì)象在Eden區(qū)+Survior1區(qū)中存不下的時(shí)候就需要分配擔(dān)保機(jī)制把當(dāng)前Eden區(qū)+Survior1區(qū)的所有對(duì)象都復(fù)制到老年代中去。 

我們知道,一個(gè)大對(duì)象能夠存入Eden區(qū)+Survior1區(qū)的概率比較小,發(fā)生分配擔(dān)保的概率比較大,而分配擔(dān)保需要涉及到大量的復(fù)制,就會(huì)造成效率低下。 

因此,對(duì)于大對(duì)象我們直接把他放到老年代中去,從而就能避免大量的復(fù)制操作。 

那么,什么樣的對(duì)象才是“大對(duì)象”呢?

通過-XX:PretrnureSizeThreshold參數(shù)設(shè)置大對(duì)象

該參數(shù)用于設(shè)置大小超過該參數(shù)的對(duì)象被認(rèn)為是“大對(duì)象”,直接進(jìn)入老年代。 

注意:該參數(shù)只對(duì)Serial和ParNew收集器有效。 

生命周期較長(zhǎng)的對(duì)象進(jìn)入老年代

老年代用于存儲(chǔ)生命周期較長(zhǎng)的對(duì)象,那么我們?nèi)绾闻袛嘁粋€(gè)對(duì)象的年齡呢?

新生代中的每個(gè)對(duì)象都有一個(gè)年齡計(jì)數(shù)器,當(dāng)新生代發(fā)生一次MinorGC后,存活下來的對(duì)象的年齡就加一,當(dāng)年齡超過一定值時(shí),就將超過該值的所有對(duì)象轉(zhuǎn)移到老年代中去。

使用-XXMaxTenuringThreshold設(shè)置新生代的***年齡

設(shè)置該參數(shù)后,只要超過該參數(shù)的新生代對(duì)象都會(huì)被轉(zhuǎn)移到老年代中去。 

相同年齡的對(duì)象內(nèi)存超過Survior內(nèi)存一半的對(duì)象進(jìn)入老年代

如果當(dāng)前新生代的Survior中,年齡相同的對(duì)象的內(nèi)存空間總和超過了Survior內(nèi)存空間的一半,那么所有年齡相同的對(duì)象和超過該年齡的對(duì)象都被轉(zhuǎn)移到老年代中去。無需等到對(duì)象的年齡超過MaxTenuringThreshold才被轉(zhuǎn)移到老年代中去。 

“分配擔(dān)保”策略詳解

當(dāng)垃圾收集器準(zhǔn)備要在新生代發(fā)起一次MinorGC時(shí),首先會(huì)檢查“老年代中***的連續(xù)空閑區(qū)域的大小 是否大于 新生代中所有對(duì)象的大???”,也就是老年代中目前能夠?qū)⑿律兴袑?duì)象全部裝下?

若老年代能夠裝下新生代中所有的對(duì)象,那么此時(shí)進(jìn)行MinorGC沒有任何風(fēng)險(xiǎn),然后就進(jìn)行MinorGC。

若老年代無法裝下新生代中所有的對(duì)象,那么此時(shí)進(jìn)行MinorGC是有風(fēng)險(xiǎn)的,垃圾收集器會(huì)進(jìn)行一次預(yù)測(cè):根據(jù)以往MinorGC過后存活對(duì)象的平均數(shù)來預(yù)測(cè)這次MinorGC后存活對(duì)象的平均數(shù)。

如果以往存活對(duì)象的平均數(shù)小于當(dāng)前老年代***的連續(xù)空閑空間,那么就進(jìn)行MinorGC,雖然此次MinorGC是有風(fēng)險(xiǎn)的。

如果以往存活對(duì)象的平均數(shù)大于當(dāng)前老年代***的連續(xù)空閑空間,那么就對(duì)老年代進(jìn)行一次Full GC,通過清除老年代中廢棄數(shù)據(jù)來擴(kuò)大老年代空閑空間,以便給新生代作擔(dān)保。

這個(gè)過程就是分配擔(dān)保。

注意: 

1. 分配擔(dān)保是老年代為新生代作擔(dān)保; 

2. 新生代中使用“復(fù)制”算法實(shí)現(xiàn)垃圾回收,老年代中使用“標(biāo)記-清除”或“標(biāo)記-整理”算法實(shí)現(xiàn)垃圾回收,只有使用“復(fù)制”算法的區(qū)域才需要分配擔(dān)保,因此新生代需要分配擔(dān)保,而老年代不需要分配擔(dān)保。

名詞解釋:

GC:垃圾收集器

Minor GC:新生代GC,指發(fā)生在新生代的垃圾收集動(dòng)作,所有的Minor GC都會(huì)觸發(fā)全世界的暫停(stop-the-world),停止應(yīng)用程序的線程,不過這個(gè)過程非常短暫。

Major GC/Full GC:老年代GC,指發(fā)生在老年代的GC。

JVM:Java Virtual Machine(Java虛擬機(jī))的縮寫。

責(zé)任編輯:武曉燕 來源: keep求索
相關(guān)推薦

2011-12-20 10:43:21

Java

2012-01-11 11:07:04

JavaJVM

2010-09-25 15:40:52

配置JVM內(nèi)存

2012-01-11 10:45:57

JavaJVM

2021-07-30 07:22:51

JVM虛擬機(jī)棧 Stack

2018-02-08 14:57:22

對(duì)象內(nèi)存分配

2023-03-26 00:43:42

JVM對(duì)象測(cè)試

2009-07-09 10:01:26

設(shè)置JVM內(nèi)存分配

2010-09-17 16:14:22

Java內(nèi)存分配

2019-09-04 15:31:04

JVM內(nèi)存String

2015-11-16 11:22:05

Java對(duì)象內(nèi)存分配

2025-03-03 09:05:56

2013-11-07 09:42:42

對(duì)象對(duì)象池加速

2010-02-22 08:58:35

JVM內(nèi)存模型垃圾收集

2020-07-02 09:15:59

Netty內(nèi)存RPC

2010-09-25 14:38:18

Java內(nèi)存分配

2023-08-24 07:46:21

服務(wù)器JVM

2018-07-04 14:43:55

對(duì)象模型內(nèi)存結(jié)構(gòu)內(nèi)存模型

2021-03-22 11:51:22

Java內(nèi)存棧上

2021-02-28 13:22:54

Java內(nèi)存代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)