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

淺談JVM調(diào)優(yōu)中的兩個小知識點

開發(fā) 后端
對JVM的調(diào)優(yōu),需要大量的場景以及經(jīng)驗,本篇主要是從一個理論的角度,粗淺地給大家介紹一下。

[[396410]]

 對JVM的調(diào)優(yōu),需要大量的場景以及經(jīng)驗,本篇主要是從一個理論的角度,粗淺地給大家介紹一下。

我把堆區(qū)的主要結(jié)構(gòu)以及參數(shù)放在下面,這樣可以參照著圖來看:

一、如何設(shè)置最大年齡

每發(fā)生一次Young GC,就會將Eden區(qū)和當(dāng)前的Survivor區(qū)的存活對象一次性地轉(zhuǎn)入到另外一個Survivor區(qū)中,并將之前的Eden區(qū)以及Survivor區(qū)清空。所以年輕代的存活對象,基本上就是在兩塊Survivor區(qū)中換來換去,每換一次,年齡增加1歲。當(dāng)?shù)竭_最大年齡時(最大年齡由-XX:MaxTenuringThreshold參數(shù)設(shè)置,默認15歲),就會被轉(zhuǎn)移進老年代。

現(xiàn)在有這樣的一個場景,8歲的對象有1000個,過了一段時間后,15歲的對象有900個??梢杂^察到,在8歲后,有90%的對象達到了默認的最大年齡,這些對象不停地在兩個Survivor區(qū)中換來換去,無疑增加了復(fù)制成本。因此,在這種情況下,我們大可以將最大年齡設(shè)置為8歲,達到8歲的對象,直接轉(zhuǎn)移至老年代,避免多次重復(fù)復(fù)制與浪費新生代空間。

二、Young GC頻繁怎么辦?

我們使用jstat -gcutil {pid} 1000,即每秒打印出GC的統(tǒng)計信息,其中YGC代表Young GC 發(fā)生的總次數(shù)。每秒刷新一次統(tǒng)計信息,如果此時發(fā)現(xiàn)YGC增加得很頻繁,比如一秒一次Young GC。

Young GC頻繁,代表著新對象的創(chuàng)建速度與新生代大小不匹配,要么是代碼中頻繁創(chuàng)建對象,要么就是新生代的空間太小。排查代碼是有必要的,但卻非常耗時。那么這一次,我們主要從調(diào)整新生代大小的方案入手。

我們大可以將新生代區(qū)增加為1.5倍(為什么是1.5倍,這只是一個試探的倍數(shù))。如果之前Young GC的每隔1000ms發(fā)生一次,那么理論上現(xiàn)在的Young GC的發(fā)生間隔在1500ms左右,頻率有所降低,但是會不會導(dǎo)致每次Young GC的耗時增加為原來的1.5倍呢?

答案是不會的

Young GC主要是對新生代進行清理,首先對Eden區(qū)和一塊Survivor區(qū)的存活對象進行標(biāo)記,然后一起復(fù)制另外一塊Survivor區(qū)中,最后直接清理Eden區(qū)和之前的Survivor區(qū)??梢姡@里耗時最嚴重的環(huán)節(jié)是復(fù)制操作。

大概98%的對象都是在幾毫秒內(nèi)死亡,即使將新生代擴充為原來的1.5倍,那么當(dāng)下一次Young GC到來時,復(fù)制的對象總數(shù)遠小于之前的1.5倍,可能只是比之前多一點點,比如是1.15倍。

因此,將新生代擴容至原來的1.5倍,理論上,掃描新生代的時間將會變?yōu)樵瓉淼?.5倍,標(biāo)記時間在[1,1.5)倍內(nèi),復(fù)制時間在[1,1.5)倍內(nèi),且這兩個時間遠小于1.5倍。對于虛擬機來說,復(fù)制的消耗成本遠大于掃描與標(biāo)記操作。因此,擴容新生代后,Young GC不會顯著地按照線性增長。

如果保持整個堆的大小不變,那么擴容新生代后,勢必會壓縮老年代的空間,Major GC的頻率可能會增加。所以,還是需要找到一個臨界點,在能夠大幅度下降Young GC的頻率時,且只在小幅度內(nèi)增加Major GC的頻率。

 

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

2023-11-11 19:07:23

JVMJava

2009-07-09 09:47:26

Sun JVM

2017-11-01 15:38:54

jvm知識點總覽

2012-01-10 14:35:08

JavaJVM

2017-07-21 08:55:13

TomcatJVM容器

2010-08-30 08:50:48

WLAN 無線網(wǎng)絡(luò)

2023-11-10 11:23:20

JVM內(nèi)存

2010-09-27 09:23:42

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

2020-11-30 11:40:35

NginxLinux性能調(diào)優(yōu)

2010-09-26 09:08:17

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

2010-09-26 13:39:46

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

2012-01-10 15:13:56

JavaJVM

2019-12-20 14:21:26

JVM調(diào)優(yōu)垃圾回收

2010-09-25 15:52:27

JVM內(nèi)存JVM

2020-12-30 15:06:39

開發(fā)技能代碼

2017-10-17 14:02:30

jvm調(diào)優(yōu)工具

2017-09-22 15:15:23

jvm調(diào)優(yōu)命令

2021-06-03 08:32:18

JVM調(diào)優(yōu)虛擬機

2024-12-04 15:49:29

2021-11-21 23:03:38

jvm調(diào)優(yōu)虛擬機
點贊
收藏

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