自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳解JVM內(nèi)存布局及GC原理,值得收藏

開發(fā) 后端
java發(fā)展歷史上出現(xiàn)過很多垃圾回收器,各有各的適應(yīng)場景,不僅僅是開發(fā),作為運(yùn)維也需要對這方面有一定的掌握,今天簡單介紹一下java的內(nèi)存布局以及各種垃圾回收器的原理。

java發(fā)展歷史上出現(xiàn)過很多垃圾回收器,各有各的適應(yīng)場景,不僅僅是開發(fā),作為運(yùn)維也需要對這方面有一定的掌握,今天簡單介紹一下java的內(nèi)存布局以及各種垃圾回收器的原理。

JVM內(nèi)存布局

JVM從概念上大致分為6個(邏輯)區(qū)域:

詳解JVM內(nèi)存布局及GC原理,值得收藏

這6塊區(qū)域按是否被線程共享,可以分為兩大類:

詳解JVM內(nèi)存布局及GC原理,值得收藏

一類是每個線程所獨(dú)享的:

  • PC Register:也稱為程序計數(shù)器, 記錄每個線程當(dāng)前執(zhí)行的指令信。eg:當(dāng)前執(zhí)行到哪一條指令,下一條該取哪條指令。
  • JVM Stack:也稱為虛擬機(jī)棧,記錄每個棧幀(Frame)中的局部變量、方法返回地址等。
  • Native Method Stack:本地(原生)方法棧,顧名思義就是調(diào)用操作系統(tǒng)原生本地方法時,所需要的內(nèi)存區(qū)域。

上述3類區(qū)域,生命周期與Thread相同,即:線程創(chuàng)建時,相應(yīng)的區(qū)域分配內(nèi)存,線程銷毀時,釋放相應(yīng)內(nèi)存。

另一類是所有線程共享的:

  • Heap:即鼎鼎大名的堆內(nèi)存區(qū),也是GC垃圾回收的主站場,用于存放類的實例對象及Arrays實例等。
  • Method Area:方法區(qū),主要存放類結(jié)構(gòu)、類成員定義,static靜態(tài)成員等。
  • Runtime Constant Pool:運(yùn)行時常量池,比如:字符串,int -128~127范圍的值等,它是Method Area中的一部分。

Heap、Method Area 都是在虛擬機(jī)啟動時創(chuàng)建,虛擬機(jī)退出時釋放。

總之,程序運(yùn)行時,內(nèi)存中的信息大致分為兩類,一是跟程序執(zhí)行邏輯相關(guān)的指令數(shù)據(jù),這類數(shù)據(jù)通常不大,而且生命周期短;一是跟對象實例相關(guān)的數(shù)據(jù),這類數(shù)據(jù)可能會很大,而且可以被多個線程長時間內(nèi)反復(fù)共用,比如字符串常量、緩存對象這類。

將這兩類特點(diǎn)不同的數(shù)據(jù)分開管理,體現(xiàn)了軟件設(shè)計上“模塊隔離”的思想。好比我們通常會把后端service與前端website解耦類似,也更便于內(nèi)存管理。

GC垃圾回收原理

1. 哪些內(nèi)存區(qū)域需要GC ?

詳解JVM內(nèi)存布局及GC原理,值得收藏

thread獨(dú)享的區(qū)域:PC Regiester、JVM Stack、Native Method Stack,其生命周期都與線程相同(即:與線程共生死),所以無需GC。線程共享的Heap區(qū)、Method Area則是GC關(guān)注的重點(diǎn)對象。

2. 常用的GC算法

(1) mark-sweep 標(biāo)記清除法

詳解JVM內(nèi)存布局及GC原理,值得收藏

如上圖,黑色區(qū)域表示待清理的垃圾對象,標(biāo)記出來后直接清空。該方法簡單快速,但是缺點(diǎn)也很明顯,會產(chǎn)生很多內(nèi)存碎片。

(2) mark-copy 標(biāo)記復(fù)制法

詳解JVM內(nèi)存布局及GC原理,值得收藏

思路也很簡單,將內(nèi)存對半分,總是保留一塊空著(上圖中的右側(cè)),將左側(cè)存活的對象(淺灰色區(qū)域)復(fù)制到右側(cè),然后左側(cè)全部清空。避免了內(nèi)存碎片問題,但是內(nèi)存浪費(fèi)很嚴(yán)重,相當(dāng)于只能使用50%的內(nèi)存。

(3) mark-compact 標(biāo)記-整理(也稱標(biāo)記-壓縮)法

詳解JVM內(nèi)存布局及GC原理,值得收藏

避免了上述兩種算法的缺點(diǎn),將垃圾對象清理掉后,同時將剩下的存活對象進(jìn)行整理挪動(類似于windows的磁盤碎片整理),保證它們占用的空間連續(xù),這樣就避免了內(nèi)存碎片問題,但是整理過程也會降低GC的效率。

(4) generation-collect 分代收集算法

上述三種算法,每種都有各自的優(yōu)缺點(diǎn),都不完美。在現(xiàn)代JVM中,往往是綜合使用的,經(jīng)過大量實際分析,發(fā)現(xiàn)內(nèi)存中的對象,大致可以分為兩類:有些生命周期很短,比如一些局部變量/臨時對象,而另一些則會存活很久,典型的比如websocket長連接中的connection對象,如下圖:

詳解JVM內(nèi)存布局及GC原理,值得收藏

縱向y軸可以理解分配內(nèi)存的字節(jié)數(shù),橫向x軸理解為隨著時間流逝(伴隨著GC),可以發(fā)現(xiàn)大部分對象其實相當(dāng)短命,很少有對象能在GC后活下來。因此誕生了分代的思想,以Hotspot為例(JDK 7):

詳解JVM內(nèi)存布局及GC原理,值得收藏

將內(nèi)存分成了三大塊:年青代(Young Genaration),老年代(Old Generation),永久代(Permanent Generation),其中Young Genaration更是又細(xì)為分eden,S0,S1三個區(qū)。

結(jié)合我們經(jīng)常使用的一些jvm調(diào)優(yōu)參數(shù)后,一些參數(shù)能影響的各區(qū)域內(nèi)存大小值,示意圖如下:

詳解JVM內(nèi)存布局及GC原理,值得收藏

GC主要過程

下圖引自阿里出品的《碼出高效-Java開發(fā)手冊》一書,梳理了GC的主要過程。

詳解JVM內(nèi)存布局及GC原理,值得收藏

責(zé)任編輯:趙寧寧 來源: 今日頭條
相關(guān)推薦

2024-07-31 08:33:17

2023-11-15 16:35:31

SQL數(shù)據(jù)庫

2019-12-10 08:59:55

JVM內(nèi)存算法

2022-05-27 08:01:36

JVM內(nèi)存收集器

2019-11-27 14:41:50

Java技術(shù)語言

2022-11-30 08:17:41

JVM調(diào)優(yōu)技巧

2012-01-11 11:07:04

JavaJVM

2011-03-11 09:41:17

JavaGC

2012-01-11 10:45:57

JavaJVM

2010-09-27 13:48:41

JVM內(nèi)存結(jié)構(gòu)

2010-09-25 12:38:40

JVM內(nèi)存模型

2020-01-06 10:58:18

JvmGC機(jī)制虛擬機(jī)

2019-09-26 08:59:39

DockerGoogle軟件

2020-12-18 08:03:00

插件MyBatis Executor

2019-06-12 15:07:24

JVMStackHeap

2010-09-26 10:53:00

JVM內(nèi)存調(diào)優(yōu)設(shè)置

2020-09-10 14:52:01

JVMJava算法

2010-09-26 13:23:13

JVM內(nèi)存管理機(jī)制

2019-02-26 14:33:22

JVM內(nèi)存虛擬機(jī)

2009-07-09 14:01:22

JVM工作原理
點(diǎn)贊
收藏

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