偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

有哪些值得收藏的JVM調(diào)優(yōu)技巧?

開發(fā) 前端
Garbage-First 垃圾回收器是服務(wù)器類型的垃圾回收器,主要針對大內(nèi)存多處理器機器。其主要目標也是低暫停時間,高吞吐量,全局標記。

哈嘍,大家好,我是指北君。

最近項目一直在跑性能測試,看到程序的MinorGC頻率增高, 每分鐘GC時間增大,心里總是會忐忑,待會兒不會又有503吧。

前言

對于Java程序員來說,GC總是繞不過去的一個知識點,總有那么一刻必然會用到這些內(nèi)容。

只是書到用時方恨少,需要進行GC優(yōu)化的時候再去看GC的每一步的詳細內(nèi)容也難以快速完成任務(wù)。

這一篇內(nèi)容就只有滿滿的干貨,可以說是拿來即用。下面我們廢話少說,走起。

1.GC算法種類

目前OpenJDK中有以下幾種常見的GC算法。

  • Serial GC
  • Parallel GC
  • CMS GC (Concurrent Mark & Sweep)
  • G1 GC
  • Z GC

目前大多數(shù)的人使用Java8居多。如果沒有明確指定GC算法,那么Java8會使用默認Parallel GC。Java9開始 ,默認GC 是G1 GC算法。Java 17 默認也是G1 GC,其中個別版本會有點差異。

下面是常用GC算法使用命令。

GC Algorithm

JVM argument

Serial GC

-XX:+UseSerialGC

Parallel GC

-XX:+UseParallelGC

CMS GC

-XX:+UseConcMarkSweepGC

G1 GC

-XX:+UseG1GC

ZGC

-XX:+UseZGC

網(wǎng)上大多數(shù)人都對ZGC算法的性能比較稱贊,如果是使用Java11以上的版本,那么可以考慮使用ZGC。奈何大多數(shù)同學(xué)們包括筆者都在Java8中久久不能自拔,所以我們這一篇就避開ZGC吧。

2. JVM的一些重要參數(shù)

JVM中的參數(shù)分為3類:

  • 標準參數(shù)(-),所有的JVM都必須實現(xiàn)這些參數(shù)的功能,并且必須向后兼容. 如java -version等
  • 非標準參數(shù)(-X),默認JVM實現(xiàn)這些功能,不保證所有的JVM都能使用,且不向后兼容。
  • 非Stable參數(shù)(-XX),這些參數(shù)每個JVM實現(xiàn)都會不同,而且將來可能取消,需要謹慎使用

關(guān)于非標準參數(shù),我們使用 java -X 命令 即可找到這些參數(shù),

  • -Xmn 新生代內(nèi)存大小,包括E區(qū)和兩個S區(qū),使用方法如下:-Xmn65535,-Xmn2048k,-Xmn512m, -Xmn2g (-Xms,-Xmx 也是同一種寫法)
  • -Xms 初始堆的大小,堆大小的最小值,默認值是物理內(nèi)存的1/64(小于1G), 默認情況下,如果堆中可用內(nèi)存小于40%時(調(diào)整參數(shù) -X:MinHeapFreeRatio=40),堆內(nèi)存會開始增加,一直增加到-Xmx的大小
  • -Xmx 堆的最大值,默認是物理內(nèi)存的1/64,如果Xms和Xmx都不設(shè)置的話,兩者的大小會相同,默認情況下,當堆中可用內(nèi)存大于70%時(調(diào)整參數(shù) -X:MaxHeapFreeRatio=70),堆內(nèi)存會開始減少,一直減少到-Xms的大小
  • -Xss 線程的棧內(nèi)存,默認時1m, 如果項目使用lombok過多的情況下,編譯的時候可能會有棧溢出,就需要配置多一點棧內(nèi)存。
  • -XX:MaxTeurningThreashold 新生代存活對象晉升到老年代的年齡閾值,對象頭中存儲age用了4個bit,所以其最大值為15。默認值是15,如果年輕代垃圾回收后總有一段時間內(nèi)存的占用仍然保持在某一個高位,過一段時間恢復(fù)正常。那么可以適當降低年齡閾值,讓存活對象更早的進入到老年代,提高年輕代的可用率。

3.使用哪種GC最合適

既然大多數(shù)同學(xué)都使用Java8,那么一定會在Parallel GC 和G1 GC中選擇了。

關(guān)于那種GC最合適,我們下面分別來看看。

3.1 如果選擇ParallelGC

ParallelGC是Java8的默認GC算法,對于新生代其使用Parallel Scavenge (復(fù)制算法),老年代垃圾回收則不同。

有兩種組合:

  • 使用 -XX:UseParallelGC 參數(shù),新生代使用 Parallel Scavenge 垃圾回收算法 ,老年代使用PSMarkSweep(Serial Old)垃圾回收算法(標記-整理算法)。
  • 使用 -XX:UseParallelOldGC 參數(shù), 新生代使用 Parallel Scavenge 垃圾回收算法,老年代使用Parallel Old垃圾回收算法(標記整理算法)。

3.1.1 Parallel Scavenge

Parallel Scavenge 是新生代并行回收器,使用復(fù)制算法。主要關(guān)注的是吞吐量,吞吐量就是JVM運行期間非垃圾回收用時百分比。

Parallel Scavenge 收集器控制吞吐量有兩個重要參數(shù):

  • 最大停頓時間 -XX:MaxGCPauseMills=100

其值為大于0的毫秒數(shù),垃圾收集器盡可能保證回收的耗時不超過設(shè)定的值,但是并不是越小越好,如果值設(shè)置太小,那么GC的頻率會提高,這樣吞吐量就降低了。

  • 控制吞吐量大小 -XX:GCTimeRatio=99

其值為0-100的整數(shù),表示吞吐量,默認值是99,表示允許1%的垃圾回收時間占比。

  • -XX:UseAdaptiveSizePolicy 自動調(diào)節(jié)新生代大小比例

啟用這個參數(shù)之后,JVM會根據(jù)當前系統(tǒng)運行情況收集監(jiān)控信息,動態(tài)調(diào)整新生代的比例等等。如果設(shè)置了這個參數(shù)之后,就不需要在設(shè)置新生代大小,Eden以及 S0/S1的比例等參數(shù)。

3.1.2 Parallel Old

Parallel Old 是老年代垃圾回收器,負責(zé)Full GC ,是一個并行垃圾回收器,整理老年代的時候,是基于“標記-整理”算法,

Parallel Old算法分為3各部分,

  • Mark:將老年代的內(nèi)存,劃分為大小固定的多個連續(xù)的Region,標記完存活對象之后,統(tǒng)計每個Region的存活對象數(shù)量。Mark階段采用串行標記所有從GC Roots可直達的對象,并行標記所有存活的對象。
  • Summary:某個Region的密度 = 存活對象的內(nèi)存大小/Region內(nèi)存大小,Summary階段會從左向右計算各個Region的密度,然后找到一個平衡點,這個平衡點左側(cè)的Region都不會進入下一個回收階段,另外一側(cè)的Region則需要進入到下一個階段進行回收。相當于只回收部分Region,Summary階段是串行執(zhí)行階段。
  • Compaction:利用Summary階段的統(tǒng)計數(shù)據(jù),針對需要整理的部分,采用“整理”算法進行操作

-XX:+ScavengeBeforeFullGC ScavengBeforeFullGC 是 Parallel GC中的一個參數(shù),默認開啟。其作用就是在一次FullGC之前先觸發(fā)一次Young GC 來清理新生代,以降低Full GC時 STW的耗時,

3.1.3 ParallelGC調(diào)優(yōu)

Parallel GC會盡量去滿足如下目標:(優(yōu)先級由高到低)

  • 最大停頓時間目標
  • 吞吐量目標
  • 最小移動目標

對ParallelGC的調(diào)優(yōu),其目標應(yīng)盡可能避免Full GC, 這就需要優(yōu)化對象老年化的頻率,

使用ParallelGC時,垃圾收集的資源開銷應(yīng)小于5%,如果已經(jīng)減少到1%甚至更少,基本上已經(jīng)達到極限了。

  • Survivor調(diào)優(yōu):ParallelGC可以自動調(diào)整Survivor空間,大部分的程序使用自動調(diào)整可以滿足要求,個別應(yīng)用在需要的情況下可以關(guān)閉自動調(diào)整,進行手動調(diào)整。
-Xmn1024m   //新生代大小
-XX:-UseAdaptiveSizePolicy //關(guān)閉自適應(yīng)調(diào)整

-XX:SurvivorRatio 可以調(diào)整新生代中Survivor與Eden區(qū)的比例,例如-XX:SurvivorRatio=6表示S(From) : S(To) : Eden = 1: 1: 6 。其默認值為8

如果發(fā)現(xiàn)GC頻率過高,整體新生代又太小,可以增大新生代的大小,從而降低YoungGC的頻率和占用時間。

可以調(diào)小 SurvivorRatio的值,在整個新生代不變的情況下,會增大Survivor區(qū)的大?。‵rom和To同時增大)。一般情況下Eden區(qū)的大小應(yīng)該比Survivor大很多,如果大量對象都在一次YoungGC后就會回收清理,那么新生代Eden:From:To 為8:1:1就比較合適。如果說很大部分對象的年齡都超過1,即需要在Survivor的From,To中來回轉(zhuǎn)換幾次之后才能被回收,那么此時可以適當增大一下Survivor區(qū)的空間,并且可以將Survivor的空間使用率增大,避免對象年齡增長過快,從而被移動到老年代,造成FullGC。

-XX:-UseAdaptiveSizePolicy  //需要關(guān)閉Survivor自適應(yīng)
-XX:TargetSurvivorRatio=<n> //Suvivor空間的使用率,默認是50%
-XX:MaxTenuringThreshold=15 //存活對象年齡,默認15,
  • 并行線程的優(yōu)化
-XX:ParallelGCThreads=<N> 

此參數(shù)設(shè)置年輕代并行收集器的線程數(shù),一般與CPU數(shù)量相等,過多的線程數(shù)量會影響垃圾回收以及整個程序的性能。

默認情況下,當CPU的數(shù)量小于8,其值等于CPU數(shù)量

CPU數(shù)量大于8個,其值等于3+5*CPU數(shù)量 / 8

  • 最大停頓時間
-XX:MaxGCPauseMills=<N> //最大停頓時間,值大于0的毫秒數(shù)

垃圾收集器為了將最大停頓時間控制在此參數(shù)內(nèi),收集器會調(diào)整堆的大小和其他的參數(shù)。

對于用戶體驗,停頓越短越好,在服務(wù)端,會比較注重高并發(fā)和高吞吐量。

  • 控制吞吐量大小
-XX:GCTimeRatio=99 //吞吐量

其值為0-100的整數(shù),表示吞吐量,默認值是99,表示允許1%的垃圾回收時間占比。暫停時間越長,那么垃圾回收占用的時間比越大,可能會超過前面的設(shè)定比例。

3.2 如果選擇G1

Garbage-First 垃圾回收器是服務(wù)器類型的垃圾回收器,主要針對大內(nèi)存多處理器機器。其主要目標也是低暫停時間,高吞吐量,全局標記。

責(zé)任編輯:武曉燕 來源: Java技術(shù)指北
相關(guān)推薦

2010-09-26 09:08:17

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

2010-09-25 15:52:27

JVM內(nèi)存JVM

2010-09-25 13:05:07

JVM參數(shù)

2010-09-17 17:02:24

JVM參數(shù)

2012-01-10 14:35:08

JavaJVM

2017-07-21 08:55:13

TomcatJVM容器

2020-12-30 15:06:39

開發(fā)技能代碼

2023-11-11 19:07:23

JVMJava

2010-09-27 09:23:42

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

2023-11-10 11:23:20

JVM內(nèi)存

2013-07-22 10:01:03

JavascriptWeb

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)垃圾回收

2021-06-03 08:32:18

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

2017-10-17 14:02:30

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

2017-09-22 15:15:23

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

2021-11-21 23:03:38

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

2024-12-04 15:49:29

2010-03-04 10:56:52

JVM參數(shù)
點贊
收藏

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