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

JVM 運(yùn)行時(shí)內(nèi)存分代結(jié)構(gòu)

云計(jì)算 虛擬化
對于Java應(yīng)用程序來說,Java堆(Java Heap)是虛擬機(jī)所管理的內(nèi)存中最大的一塊。Java堆是被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。

對于Java應(yīng)用程序來說,Java堆(Java Heap)是虛擬機(jī)所管理的內(nèi)存中最大的一塊。Java堆是被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。此內(nèi)存區(qū)域的唯一目的就是存放對象實(shí)例,所有的對象實(shí)例都在這里分配內(nèi)存。

Java堆是垃圾收集器管理的內(nèi)存區(qū)域。從回收內(nèi)存的角度看,由于大部分垃圾收集器大部分都是基于分代收集理論設(shè)計(jì)的,所以 Java 堆中經(jīng)常會(huì)出現(xiàn)“新生代”“老年代”“永久代”“Eden空間”“From Survivor空 間”“To Survivor空間”等區(qū)域。這些區(qū)域劃分僅僅是一部分垃圾收集器的共同特性或者說設(shè)計(jì)風(fēng)格而已,而非某個(gè)Java虛擬機(jī)具體實(shí)現(xiàn)的固有內(nèi)存布局,不是《Java虛擬機(jī)規(guī)范》里對Java堆的官方的定義。比如:Shenandoah、ZGC 就不支持分代。

JDK 1.7 分代結(jié)構(gòu)

在 JDK 1.7 以及之前堆空間分為 3 部分:新生代,老年代,永久代。然后新生代分為:Eden 區(qū), 和兩個(gè) Survivor 區(qū)。如下圖所示

圖片

JDK 1.8 分代結(jié)構(gòu)

在 JDK 1.8 及其以后,堆空間中移除了永久代。為什么刪除永久代的緣由可以閱讀以下文檔:http://openjdk.java.net/jeps/122。其核心原因主要有以下幾點(diǎn):這是 Hotspot 和 JRockit 虛擬機(jī)融合。JRockit 客戶不需要配置永久代(因?yàn)镴Rockit 沒有永久代),習(xí)慣不配置永久代。增加元空間解決類加載所需要的內(nèi)存空間,而且元空間默認(rèn)是自動(dòng)拓容的。這樣減少內(nèi)存溢出的可能。堆空間移除永久代過后,堆空間的結(jié)構(gòu)如下圖所示:

圖片

運(yùn)行時(shí)數(shù)據(jù)區(qū)結(jié)構(gòu)如下圖所示:

圖片

G1 收集器

G1將新生代,老年代的物理空間劃分取消了。取而代之的是,G1算法將堆劃分為若干個(gè)區(qū)域(Region),它仍然屬于分代收集器。不過,這些區(qū)域的一部分包含新生代,新生代的垃圾收集依然采用暫停所有應(yīng)用線程的方式,將存活對象拷貝到老年代或者Survivor空間。老年代也分成很多區(qū)域,G1收集器通過將對象從一個(gè)區(qū)域復(fù)制到另外一個(gè)區(qū)域,完成了清理工作。這就意味著,在正常的處理過程中,G1完成了堆的壓縮(至少是部分堆的壓縮),這樣也就不會(huì)有cms內(nèi)存碎片問題的存在了。

圖片

在G1中,還有一種特殊的區(qū)域,叫Humongous區(qū)域。如果一個(gè)對象占用的空間超過了分區(qū)容量50%以上,G1收集器就認(rèn)為這是一個(gè)巨型對象。這些巨型對象,默認(rèn)直接會(huì)被分配在年老代,但是如果它是一個(gè)短期存在的巨型對象,就會(huì)對垃圾收集器造成負(fù)面影響。為了解決這個(gè)問題,G1劃分了一個(gè)Humongous區(qū),它用來專門存放巨型對象。如果一個(gè)H區(qū)裝不下一個(gè)巨型對象,那么G1會(huì)尋找連續(xù)的H分區(qū)來存儲(chǔ)。為了能找到連續(xù)的H區(qū),有時(shí)候不得不啟動(dòng)Full GC。

對象內(nèi)存分配

對象內(nèi)存分配過程如下:

圖片

下面是具體的幾種內(nèi)存分配規(guī)則描述

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

大多數(shù)情況下,對象在新生代 Eden 區(qū)中分配。當(dāng)Eden區(qū)沒有足夠空間進(jìn)行分配時(shí),虛擬機(jī)將發(fā)起一次 Minor GC。HotSpot虛擬機(jī)提供了-XX:+PrintGCDetails 這個(gè)收集器日志參數(shù),告訴虛擬機(jī)在發(fā)生垃圾收集行為時(shí)打印內(nèi)存回收日志,并且在進(jìn)程退出的時(shí)候輸出當(dāng)前的內(nèi)存各區(qū)域分配情況。測試代碼:

  1. /** 
  2.  * -XX:+PrintGCDetails 
  3.  */ 
  4. public class GCTest { 
  5.  
  6.     public static void main(String[] args) { 
  7.         byte[] allcation2 = new byte[8000 * 1024]; 
  8.     } 

輸出結(jié)果

  1. Heap 
  2.  PSYoungGen      total 38400K, used 11353K [0x0000000795580000, 0x0000000798000000, 0x00000007c0000000) 
  3.   eden space 33280K, 34% used [0x0000000795580000,0x00000007960966f8,0x0000000797600000) 
  4.   from space 5120K, 0% used [0x0000000797b00000,0x0000000797b00000,0x0000000798000000) 
  5.   to   space 5120K, 0% used [0x0000000797600000,0x0000000797600000,0x0000000797b00000) 
  6.  ParOldGen       total 87552K, used 0K [0x0000000740000000, 0x0000000745580000, 0x0000000795580000) 
  7.   object space 87552K, 0% used [0x0000000740000000,0x0000000740000000,0x0000000745580000) 
  8.  Metaspace       used 3017K, capacity 4556K, committed 4864K, reserved 1056768K 
  9.   class space    used 319K, capacity 392K, committed 512K, reserved 1048576K 

我們可以通過內(nèi)存空間的分布可以看出 allcation2 是被分配到 eden 區(qū)中的。

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

大對象就是指需要大量連續(xù)內(nèi)存空間的Java對象(比如:字符串、數(shù)組),JVM 參數(shù) -XX:PretenureSizeThreshold 參數(shù)可以設(shè)置大對象的大小,指定大于該設(shè)置值的對象直接在老年代分配,不會(huì)進(jìn)入年輕代,這個(gè)參數(shù)只有在 Serial 和 ParNew 兩個(gè)收集器下有效。比如設(shè)置:JVM 參數(shù):-XX:PretenureSizeThreshold=1000000(單位直接)-XX:+UseSerialGC, 在執(zhí)行上面的第一個(gè)程序就會(huì)發(fā)現(xiàn)大對象直接進(jìn)入了老年代。這樣做的目的就是避免在Eden區(qū)及兩個(gè)Survivor區(qū)之間來回復(fù)制,產(chǎn)生大量的內(nèi)存復(fù)制操作。

長期存活的對象將進(jìn)入老年代

HotSpot虛擬機(jī)中多數(shù)收集器都采用了分代收集來管理堆內(nèi)存,那內(nèi)存回收時(shí)就必須能決策哪些存活對象應(yīng)當(dāng)放在新生代,哪些存活對象放在老年代中。為做到這點(diǎn),虛擬機(jī)給每個(gè)對象定義了一個(gè)對象年齡(Age)計(jì)數(shù)器,存儲(chǔ)在對象頭中。對象通常在Eden區(qū)里誕生,如果經(jīng)過第一次 Minor GC 后仍然存活,并且能被 Survivor 容納的話,該對象會(huì)被移動(dòng)到 Survivor 空間中,并且將其對象年齡設(shè)為1歲。對象在Survivor區(qū)中每熬過一次Minor GC,年齡就增加1歲,當(dāng)它的年齡增加到一定程度(默認(rèn)為15),就會(huì)被晉升到老年代中。對象晉升老年代的年齡閾值,可以通過參數(shù) -XX:MaxTenuringThreshold 設(shè)置。

動(dòng)態(tài)對象年齡判斷

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

空間分配擔(dān)保

在發(fā)生 Minor GC 之前,虛擬機(jī)必須先檢查老年代最大可用的連續(xù)空間是否大于新生代所有對象總空間。

本文轉(zhuǎn)載自微信公眾號「運(yùn)維開發(fā)故事」

【編輯推薦】

 

責(zé)任編輯:姜華 來源: 運(yùn)維開發(fā)故事
相關(guān)推薦

2017-04-25 14:39:55

JVM內(nèi)存Java

2015-07-20 15:44:46

Swift框架MJExtension反射

2009-06-17 15:46:36

Java運(yùn)行時(shí)本機(jī)內(nèi)存

2024-03-21 09:15:58

JS運(yùn)行的JavaScrip

2018-10-25 09:04:56

Java虛擬機(jī)JVM

2021-05-07 09:40:26

云計(jì)算云原生WebAssembly

2022-03-21 11:07:43

JVM內(nèi)存字節(jié)碼

2019-07-12 09:30:12

DashboardDockerDNS

2021-09-11 15:38:23

容器運(yùn)行鏡像開放

2020-11-16 09:28:41

函數(shù)內(nèi)存

2018-11-22 12:07:37

Java虛擬機(jī)結(jié)構(gòu)

2022-01-17 22:09:50

JVM方法區(qū)數(shù)據(jù)

2021-10-14 09:53:38

鴻蒙HarmonyOS應(yīng)用

2023-07-28 10:42:43

2020-12-07 13:31:43

GoMutex開發(fā)者

2021-08-18 08:32:09

代碼運(yùn)行時(shí)間示波器

2013-11-26 16:49:55

Android開發(fā)運(yùn)行時(shí)KitKat

2023-01-03 09:10:21

2024-03-20 10:46:00

云原生容器

2022-01-19 08:50:53

設(shè)備樹Linux文件系統(tǒng)
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 在线看av的网址 | 91免费视频| 最新黄色在线观看 | 人妖videosex高潮另类 | 在线日韩中文字幕 | 人人干人人爽 | 亚洲精品久久国产高清情趣图文 | 精精国产xxxx视频在线播放 | 成人在线免费观看 | 黄色网络在线观看 | 欧美簧片 | 国产成人精品一区二区三区 | 国产精品美女在线观看 | 国产高清在线精品 | 国产大片一区 | 亚洲天堂一区二区 | 精品一区二区av | 成人精品一区二区 | 国产最新视频在线 | 久久欧美高清二区三区 | 国产精品毛片无码 | 亚洲国产日本 | 久久久国产一区二区三区四区小说 | 在线观看电影av | 国产精品中文字幕在线 | 精品国产一级 | 欧美视频三区 | 天天综合网7799精品 | 精品国产伦一区二区三区观看说明 | 小草久久久久久久久爱六 | 日韩精品在线一区 | 久久一区二区三区免费 | 欧美一区二区三 | 精品不卡| 久久久久国产一区二区三区四区 | 日韩中文一区二区 | 五月天婷婷狠狠 | 黑人巨大精品欧美一区二区免费 | 黄色在线免费播放 | 亚洲国产精品一区二区www | 一区二区免费看 |