成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JVM學習--對象內存的分配策略

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

Java所承諾的自動內存管理主要是針對對象內存的回收和對象內存的分配。

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

而Java虛擬機中的方法區因為是用來存儲類信息、常量、靜態變量,這些數據的變動性較小,因此不是Java內存管理重點需要關注的區域。

[[225094]]

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

綜上所述:Java自動內存管理最核心的功能是堆內存中對象的分配與回收。 

對象優先在Eden區中分配

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

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

每次創建對象時,首先會在Eden區中分配。 

若Eden區已滿,則在Survior1區中分配。 

若Eden區+Survior1區剩余內存太少,導致對象無法放入該區域時,就會啟用“分配擔保”,將當前Eden區+Survior1區中的對象轉移到老年代中,然后再將新對象存入Eden區。 

大對象直接進入老年代

所謂“大對象”就是指一個占用大量連續存儲空間的對象,如數組。

當發現一個大對象在Eden區+Survior1區中存不下的時候就需要分配擔保機制把當前Eden區+Survior1區的所有對象都復制到老年代中去。 

我們知道,一個大對象能夠存入Eden區+Survior1區的概率比較小,發生分配擔保的概率比較大,而分配擔保需要涉及到大量的復制,就會造成效率低下。 

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

那么,什么樣的對象才是“大對象”呢?

通過-XX:PretrnureSizeThreshold參數設置大對象

該參數用于設置大小超過該參數的對象被認為是“大對象”,直接進入老年代。 

注意:該參數只對Serial和ParNew收集器有效。 

生命周期較長的對象進入老年代

老年代用于存儲生命周期較長的對象,那么我們如何判斷一個對象的年齡呢?

新生代中的每個對象都有一個年齡計數器,當新生代發生一次MinorGC后,存活下來的對象的年齡就加一,當年齡超過一定值時,就將超過該值的所有對象轉移到老年代中去。

使用-XXMaxTenuringThreshold設置新生代的***年齡

設置該參數后,只要超過該參數的新生代對象都會被轉移到老年代中去。 

相同年齡的對象內存超過Survior內存一半的對象進入老年代

如果當前新生代的Survior中,年齡相同的對象的內存空間總和超過了Survior內存空間的一半,那么所有年齡相同的對象和超過該年齡的對象都被轉移到老年代中去。無需等到對象的年齡超過MaxTenuringThreshold才被轉移到老年代中去。 

“分配擔保”策略詳解

當垃圾收集器準備要在新生代發起一次MinorGC時,首先會檢查“老年代中***的連續空閑區域的大小 是否大于 新生代中所有對象的大小?”,也就是老年代中目前能夠將新生代中所有對象全部裝下?

若老年代能夠裝下新生代中所有的對象,那么此時進行MinorGC沒有任何風險,然后就進行MinorGC。

若老年代無法裝下新生代中所有的對象,那么此時進行MinorGC是有風險的,垃圾收集器會進行一次預測:根據以往MinorGC過后存活對象的平均數來預測這次MinorGC后存活對象的平均數。

如果以往存活對象的平均數小于當前老年代***的連續空閑空間,那么就進行MinorGC,雖然此次MinorGC是有風險的。

如果以往存活對象的平均數大于當前老年代***的連續空閑空間,那么就對老年代進行一次Full GC,通過清除老年代中廢棄數據來擴大老年代空閑空間,以便給新生代作擔保。

這個過程就是分配擔保。

注意: 

1. 分配擔保是老年代為新生代作擔保; 

2. 新生代中使用“復制”算法實現垃圾回收,老年代中使用“標記-清除”或“標記-整理”算法實現垃圾回收,只有使用“復制”算法的區域才需要分配擔保,因此新生代需要分配擔保,而老年代不需要分配擔保。

名詞解釋:

GC:垃圾收集器

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

Major GC/Full GC:老年代GC,指發生在老年代的GC。

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

責任編輯:武曉燕 來源: keep求索
相關推薦

2011-12-20 10:43:21

Java

2012-01-11 11:07:04

JavaJVM

2010-09-25 15:40:52

配置JVM內存

2012-01-11 10:45:57

JavaJVM

2021-07-30 07:22:51

JVM虛擬機棧 Stack

2018-02-08 14:57:22

對象內存分配

2023-03-26 00:43:42

JVM對象測試

2009-07-09 10:01:26

設置JVM內存分配

2010-09-17 16:14:22

Java內存分配

2019-09-04 15:31:04

JVM內存String

2015-11-16 11:22:05

Java對象內存分配

2025-03-03 09:05:56

2013-11-07 09:42:42

對象對象池加速

2010-02-22 08:58:35

JVM內存模型垃圾收集

2020-07-02 09:15:59

Netty內存RPC

2010-09-25 14:38:18

Java內存分配

2023-08-24 07:46:21

服務器JVM

2018-07-04 14:43:55

對象模型內存結構內存模型

2021-03-22 11:51:22

Java內存棧上

2021-02-28 13:22:54

Java內存代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 毛片网络 | 欧美日韩不卡合集视频 | 久草在线在线精品观看 | 在线视频亚洲 | 天天综合久久 | 亚洲一区电影 | 在线小视频| 欧美成视频在线观看 | 欧美日韩不卡 | 玖玖综合网 | 超碰97人人人人人蜜桃 | 紧缚调教一区二区三区视频 | 日韩色在线 | 久久岛国| 久久久久久久久国产精品 | 亚洲精品电影网在线观看 | 久久久久国产一级毛片 | 欧美一卡二卡在线观看 | 天天干夜夜操视频 | 精品国产一区久久 | 欧美另类日韩 | 免费国产视频在线观看 | 亚洲欧美在线免费观看 | 羞羞视频免费观 | 精品福利视频一区二区三区 | 最大av在线| 亚洲精品第一 | 免费观看av | 亚洲综合视频一区 | 一级毛片视频 | 免费国产一区二区 | 欧美电影网| 米奇成人网 | 天天综合网永久 | 九九国产 | 精品久久视频 | 大象视频一区二区 | 国产69久久精品成人看动漫 | 日韩欧美在线免费观看视频 | 亚洲国产精品99久久久久久久久 | 97日韩精品|