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

Java中GC原理及GC日志剖析

開發(fā) 開發(fā)工具 后端
學(xué)習(xí)Java的我們都知道垃圾收集(GC),大部分人把這項(xiàng)技術(shù)當(dāng)作是Java語言的伴生產(chǎn)物。事實(shí)上,GC的歷史比Java久遠(yuǎn),1960年誕生于MIT的Lisp是第一門真正使用內(nèi)存動態(tài)分配和垃圾收集技術(shù)的語言。那我們今天就研究下垃圾收集原理。

 一.概述

學(xué)習(xí)Java的我們都知道垃圾收集(GC),大部分人把這項(xiàng)技術(shù)當(dāng)作是Java語言的伴生產(chǎn)物。事實(shí)上,GC的歷史比Java久遠(yuǎn),1960年誕生于MIT的Lisp是第一門真正使用內(nèi)存動態(tài)分配和垃圾收集技術(shù)的語言。那我們今天就研究下垃圾收集原理。

[[283919]]

二.對象已死嗎?

Java的垃圾回收主要是對堆內(nèi)存的回收,里面存放著Java幾乎所有的對象實(shí)例,垃圾回收之前是要確定哪些還“存活”,哪些已經(jīng)“死去”。

1.引用計(jì)數(shù)器法

給對象添加一個引用計(jì)數(shù)器,每當(dāng)有地方對他進(jìn)行引用時計(jì)數(shù)器值➕1;當(dāng)引用失效時,計(jì)數(shù)器值就➖1,任何時候計(jì)數(shù)器值為0的時候表示對象不可能在使用的。

2.可達(dá)性分析算法

通過一系列稱為“GC Roots”的對象作為起點(diǎn),從這些節(jié)點(diǎn)往下搜索,搜索所走過的路徑稱為“引用鏈”,當(dāng)一個對象到“GC Roots”沒有任何引用鏈相連時,則證明對象是不可用的。

代碼示例:

GC日志如下:

我們很明顯的看到GC日志中6092K->456K,意味著虛擬機(jī)并沒有因?yàn)檫@兩個對象互相引用而不回收他們,所以Java虛擬機(jī)使用的是可達(dá)性分析算法標(biāo)記的。

其實(shí)即使被可達(dá)性分析算法標(biāo)記的不可達(dá)對象也不是一定會被回收的,虛擬機(jī)會對這些對象進(jìn)行一次篩選,篩選的條件是此對象是否有必要執(zhí)行finalize()方法。當(dāng)對象沒有覆蓋finalize()方法或者finalize()已經(jīng)被虛擬機(jī)調(diào)用過,虛擬機(jī)將這兩種情況視為“沒有必要執(zhí)行”。如果對象被判定有必要執(zhí)行,finalize()方法是并在finalize()中與“GC Roots”建立關(guān)聯(lián),則此對象不會被回收了。

三.垃圾回收算法

我們知道了虛擬機(jī)怎么標(biāo)記一個對象是否可用,那他怎么進(jìn)行回收的呢?其實(shí)堆內(nèi)存可以分為新生代和老年代,新生代又被劃分為一個Eden和兩個Survivor區(qū)域,他們的比例為8:1:1,不同的垃圾收集器廠商對這兩個區(qū)域給出了不同的算法。

1.新生代——復(fù)制算法

新生代對象的特點(diǎn)就是,大部分對象在一次GC中會被回收掉,所以使用的是復(fù)制算法:新生代每次創(chuàng)建對象的時候只會使用一個Eden和其中的一塊Survivor,在垃圾回收時將存活的對象復(fù)制到另外一塊Survivor區(qū)域,最后清理掉Eden和剛才的Survivor區(qū)域。

2.老年代——標(biāo)記-整理算法

老年代一般保存的是一些大對象,或者不被經(jīng)?;厥盏膶ο螅鶕?jù)特點(diǎn)使用的標(biāo)記-整理算法:如同名字一樣,算法分為“標(biāo)記”和“整理”兩個階段:首先先標(biāo)記出所有需要回收的對象,在標(biāo)記完成后統(tǒng)一回收所有被標(biāo)記的對象進(jìn)行整理,將被標(biāo)記的對象都向一端移動,然后直接清理掉邊界以外的內(nèi)存。

四.HotSpot算法實(shí)現(xiàn)

上面說了我們怎么標(biāo)記對象“死亡”和怎么進(jìn)行垃圾回收的,但在HotSpot虛擬機(jī)在實(shí)現(xiàn)這些算法上是必須對算法的執(zhí)行效率進(jìn)行考量的。

1.安全點(diǎn)

在可達(dá)性分析中對執(zhí)行的時間的敏感體現(xiàn)在GC停頓上,其意思是在整個分析的過程中看起來就像被凍結(jié)在某一個時間點(diǎn)上的,不可以出現(xiàn)分析的過程中引用關(guān)系在不斷變化,如果這點(diǎn)得不到保證則分析的結(jié)果的準(zhǔn)確性就得不到保障。這點(diǎn)是導(dǎo)致在GC進(jìn)行時需要停頓所有的Java執(zhí)行線程。

當(dāng)執(zhí)行系統(tǒng)停頓下來后,虛擬機(jī)并不需要全部上下文和全局所有的位置,虛擬機(jī)通過一個OopMap的數(shù)據(jù)結(jié)構(gòu)在類加載的時候?qū)ο蟮钠屏繑?shù)據(jù)信息記錄下來,所以GC掃描是直接得到這些信息的。其實(shí)這些通過指令被加入進(jìn)行記載對象信息的OopMap位置也叫做安全點(diǎn),程序執(zhí)行時并非所有點(diǎn)都可以停下來開始GC的,只有在到達(dá)安全點(diǎn)才能停頓。安全點(diǎn)機(jī)制程序執(zhí)行中,在不太長的時間內(nèi)會遇到可進(jìn)入GC的安全點(diǎn)。在實(shí)際中會遇到在GC時有線程不再執(zhí)行,例如線程被掛起了。這是我們需要安全區(qū)域去解決。

2.安全區(qū)域

安全區(qū)域是指在一段代碼片段中,引用關(guān)系不會發(fā)生變化。在這個區(qū)域中的任意地方開始GC都是安全的。在代碼執(zhí)行到安全區(qū)域時,首先表示這直接進(jìn)去安全區(qū)域,這樣虛擬機(jī)在這段時間GC時就不用管那些標(biāo)記為安全區(qū)域的線程了。當(dāng)離開安全區(qū)域時首先得判斷GC分析是否完成,沒完成則需要等待。

五.理解GC日志

這是上圖打印的GC日志

[GC (System.gc()) [PSYoungGen: 6092K->448K(38400K)] 6092K->456K(125952K), 0.0051702 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]

其中,PSYoungGen表示的是新生代GC不同垃圾收集器新生代名稱不一樣,6092K->448K(38400K)表示新生代大小的變化,6092K->456K(125952K)表示堆內(nèi)存的大小變化,后面表示用時。

[Full GC (System.gc()) [PSYoungGen: 448K->0K(38400K)] [ParOldGen: 8K->378K(87552K)] 456K->378K(125952K), [Metaspace: 3050K->3050K(1056768K)], 0.0056045 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]

這里表示發(fā)生在老年代的GC(Major GC/Full GC) 它只是為伴隨一次的新生代的GC(Minor GC),448K->0K(38400K)表示新生代內(nèi)存變化,8K->378K(87552K) 表示老年代GC變化,456K->378K(125952K)表示GC前后堆內(nèi)存的變化。

【本文是51CTO專欄機(jī)構(gòu)“AiChinaTech”的原創(chuàng)文章,微信公眾號( id: tech-AI)”】

戳這里,看該作者更多好文

 

責(zé)任編輯:華軒 來源: 51CTO
相關(guān)推薦

2024-02-05 19:06:04

DartVMGC流程

2017-05-18 15:02:36

AndroidGC原理JVM內(nèi)存回收

2011-03-11 09:41:17

JavaGC

2019-09-02 14:53:53

JVM內(nèi)存布局GC

2009-06-15 10:43:45

Java程序員Java程序GC

2014-05-08 14:13:00

Java面向GC

2021-08-10 08:52:15

微軟GCToolkit工具

2017-09-26 16:32:03

JavaGC分析

2017-01-15 17:34:08

2023-12-12 08:00:39

2020-03-03 17:35:09

Full GCMinor

2024-08-30 08:50:00

2019-09-26 09:24:01

GC原理調(diào)優(yōu)

2022-01-25 09:15:39

V8垃圾回收算法

2009-06-11 10:25:36

Java GC幽靈引用

2012-02-08 10:37:42

Java反射

2023-12-07 12:21:04

GCJVM垃圾

2025-04-24 09:01:37

2023-10-13 12:28:38

2017-11-08 15:23:57

Java GC優(yōu)化jvm
點(diǎn)贊
收藏

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