JVM實(shí)戰(zhàn)優(yōu)化篇

在前文《JVM原理解惑篇》中已經(jīng)梳理了主要的JVM的理論基礎(chǔ):Java程序運(yùn)行在Java虛擬機(jī)之上宛裕,JVM管理了整個(gè)程序的內(nèi)存分配和使用烤宙,負(fù)責(zé)對(duì)象的整個(gè)生命周期绰咽。這部分內(nèi)容是廣大Java開(kāi)發(fā)者都比較熟知的內(nèi)容寝杖,在面試或者看書(shū)博客過(guò)程中多少有過(guò)印象的蜕着,但是轉(zhuǎn)到項(xiàng)目實(shí)戰(zhàn)中酬凳,例如核心的JVM參數(shù)有哪些惠况,如何根據(jù)項(xiàng)目評(píng)估一套合理的JVM參數(shù),在項(xiàng)目上線后如何根據(jù)業(yè)務(wù)優(yōu)化JVM配置宁仔,碰到GC頻繁該如何分析解決等等實(shí)際問(wèn)題稠屠,就基本沒(méi)有章法了,如果盲目上網(wǎng)去找JVM優(yōu)化的文章大部分只說(shuō)參數(shù)調(diào)優(yōu)不基于背景,基本是盲人摸象無(wú)法把握住關(guān)鍵問(wèn)題完箩,這篇文章即是對(duì)JVM實(shí)戰(zhàn)和優(yōu)化進(jìn)行一個(gè)系統(tǒng)化的梳理赐俗,也是近日對(duì)JVM整個(gè)學(xué)習(xí)使用的一個(gè)總結(jié),首先上篇章大綱圖:

image

一弊知、JVM內(nèi)存相關(guān)參數(shù)


1.JVM內(nèi)存參數(shù)的權(quán)衡

首先阻逮,JVM最重要最核心的參數(shù)是去評(píng)估內(nèi)存和分配,第一步需要指定堆內(nèi)存的大小秩彤,這個(gè)是系統(tǒng)上線必須要做的叔扼,-Xms 初始堆大小,-Xmx 最大堆大小漫雷,后臺(tái)Java服務(wù)中一般都指定為系統(tǒng)內(nèi)存的一半瓜富,過(guò)大會(huì)占用服務(wù)器的系統(tǒng)資源,過(guò)小則無(wú)法發(fā)揮JVM的最佳性能降盹。

其次需要指定-Xmn新生代的大小与柑,這個(gè)參數(shù)非常關(guān)鍵,靈活度很大蓄坏,雖然sun官方推薦為3/8大小价捧,但是要根據(jù)業(yè)務(wù)場(chǎng)景來(lái)定,針對(duì)于無(wú)狀態(tài)或者輕狀態(tài)服務(wù)(現(xiàn)在最常見(jiàn)的業(yè)務(wù)系統(tǒng)如Web應(yīng)用)來(lái)說(shuō)涡戳,一般新生代甚至可以給到堆內(nèi)存的3/4大薪狍;而對(duì)于有狀態(tài)服務(wù)(常見(jiàn)如IM服務(wù)渔彰、網(wǎng)關(guān)接入層等系統(tǒng))新生代可以按照默認(rèn)比例1/3來(lái)設(shè)置嵌屎。服務(wù)有狀態(tài),則意味著會(huì)有更多的本地緩存和會(huì)話狀態(tài)信息常駐內(nèi)存恍涂,應(yīng)為要給老年代設(shè)置更大的空間來(lái)存放這些對(duì)象宝惰。

最后是設(shè)置-Xss棧內(nèi)存大小,設(shè)置單個(gè)線程棧大小再沧,默認(rèn)值和JDK版本掌测、系統(tǒng)有關(guān),一般默認(rèn)512~1024kb产园。一個(gè)后臺(tái)服務(wù)如果常駐線程有幾百個(gè),那么棧內(nèi)存這邊也會(huì)占用了幾百M(fèi)的大小夜郁。

image

2.如何設(shè)置JVM參數(shù)

如果在IDEA中調(diào)試JVM參數(shù)什燕,只需要打開(kāi)項(xiàng)目的Configuration中,對(duì)VM Options進(jìn)行設(shè)置即可:

image

如果在Linux環(huán)境中調(diào)試JVM參數(shù)竞端,需要在啟動(dòng)Java進(jìn)程的時(shí)候屎即,加入到啟動(dòng)命令中:

[root@LOCAL~]#java -Xmx512m -Xms512m -Xmn256m -Xss1m –jar hello.jar

服務(wù)啟動(dòng)后,在日志的第一行就會(huì)打印jvm參數(shù)相關(guān)信息:可以驗(yàn)證啟動(dòng)后的jvm參數(shù)是否設(shè)置成功!

二技俐、新系統(tǒng)上線如何規(guī)劃容量

1.套路總結(jié)

任何新的業(yè)務(wù)系統(tǒng)在上線以前都需要去估算服務(wù)器配置和JVM的內(nèi)存參數(shù)乘陪,這個(gè)容量與資源規(guī)劃并不僅僅是系統(tǒng)架構(gòu)師的隨意估算的,需要根據(jù)系統(tǒng)所在業(yè)務(wù)場(chǎng)景去估算雕擂,推斷出來(lái)一個(gè)系統(tǒng)運(yùn)行模型啡邑,評(píng)估JVM性能和GC頻率等等指標(biāo)。以下是我結(jié)合大牛經(jīng)驗(yàn)以及自身實(shí)踐來(lái)總結(jié)出來(lái)的一個(gè)建模步驟:

  • 計(jì)算業(yè)務(wù)系統(tǒng)每秒鐘創(chuàng)建的對(duì)象會(huì)占用多大的內(nèi)存空間井赌,然后計(jì)算集群下的每個(gè)系統(tǒng)每秒的內(nèi)存占用空間(對(duì)象創(chuàng)建速度)
  • 設(shè)置一個(gè)機(jī)器配置谤逼,估算新生代的空間,比較不同新生代大小之下仇穗,多久觸發(fā)一次MinorGC流部。
  • 為了避免頻繁GC,就可以重新估算需要多少機(jī)器配置纹坐,部署多少臺(tái)機(jī)器枝冀,給JVM多大內(nèi)存空間,新生代多大空間耘子。
  • 根據(jù)這套配置果漾,基本可以推算出整個(gè)系統(tǒng)的運(yùn)行模型,每秒創(chuàng)建多少對(duì)象拴还,1s以后成為垃圾跨晴,系統(tǒng)運(yùn)行多久新生代會(huì)觸發(fā)一次GC,頻率多高片林。

2.套路實(shí)戰(zhàn)——以登錄系統(tǒng)為例

有些同學(xué)看到這些步驟還是發(fā)憷端盆,說(shuō)的好像是那么回事,一到實(shí)際項(xiàng)目中到底怎么做我還是不知道费封!光說(shuō)不練假把式焕妙,這里就以登錄系統(tǒng)為例模擬一下推演過(guò)程:

  • 假設(shè)每天100w次登陸請(qǐng)求,登陸峰值在早上弓摘,預(yù)估峰值時(shí)期每秒100次登陸請(qǐng)求焚鹊。
  • 假設(shè)部署3臺(tái)服務(wù)器,每臺(tái)機(jī)器每秒處理30次登陸請(qǐng)求韧献,假設(shè)一個(gè)登陸請(qǐng)求需要處理1秒鐘末患,JVM新生代里每秒就要生成30個(gè)登陸對(duì)象,1s之后請(qǐng)求完畢這些對(duì)象成為了垃圾锤窑。
  • 一個(gè)登陸請(qǐng)求對(duì)象假設(shè)20個(gè)字段璧针,一個(gè)對(duì)象估算500字節(jié),30個(gè)登陸占用大約15kb渊啰,考慮到RPC和DB操作探橱,網(wǎng)絡(luò)通信申屹、寫(xiě)庫(kù)、寫(xiě)緩存一頓操作下來(lái)隧膏,可以擴(kuò)大到20-50倍哗讥,大約1s產(chǎn)生幾百k-1M數(shù)據(jù)。
  • 假設(shè)2C4G機(jī)器部署胞枕,分配2G堆內(nèi)存杆煞,新生代則只有幾百M(fèi),按照1s1M的垃圾產(chǎn)生速度曲稼,幾百秒就會(huì)觸發(fā)一次MinorGC了索绪。
  • 假設(shè)4C8G機(jī)器部署,分配4G堆內(nèi)存贫悄,新生代分配2G瑞驱,如此需要幾個(gè)小時(shí)才會(huì)觸發(fā)一次MinorGC。

到這里窄坦,可以粗略的推斷出來(lái)一個(gè)每天100w次請(qǐng)求的登錄系統(tǒng)唤反,按照4C8G的3實(shí)例集群配置,分配4G堆內(nèi)存鸭津、2G新生代的JVM彤侍,可以保障系統(tǒng)的一個(gè)正常負(fù)載∧媲鳎基本上把一個(gè)新系統(tǒng)的資源評(píng)估了出來(lái)盏阶,所以搭建新系統(tǒng)要每個(gè)實(shí)例需要多少容量多少配置,集群配置多少個(gè)實(shí)例等等這些闻书,并不是拍拍腦袋和胸脯就可以決定的下來(lái)的名斟。

三、垃圾回收器的選擇


1.吞吐量還是響應(yīng)時(shí)間

首先引入兩個(gè)概念:吞吐量和低延遲
吞吐量 = CPU在用戶應(yīng)用程序運(yùn)行的時(shí)間 / (CPU在用戶應(yīng)用程序運(yùn)行的時(shí)間 + CPU垃圾回收的時(shí)間)
響應(yīng)時(shí)間 = 平均每次的GC的耗時(shí)

通常魄眉,吞吐優(yōu)先還是響應(yīng)優(yōu)先這個(gè)在JVM中是一個(gè)兩難之選砰盐。堆內(nèi)存增大,gc一次能處理的數(shù)量變大坑律,吞吐量大岩梳;但是gc一次的時(shí)間會(huì)變長(zhǎng),導(dǎo)致后面排隊(duì)的線程等待時(shí)間變長(zhǎng)晃择;相反冀值,如果堆內(nèi)存小,gc一次時(shí)間短宫屠,排隊(duì)等待的線程等待時(shí)間變短池摧,延遲減少激况,但一次請(qǐng)求的數(shù)量變小(并不絕對(duì)符合)。無(wú)法同時(shí)兼顧乌逐,是吞吐優(yōu)先還是響應(yīng)優(yōu)先竭讳,這是一個(gè)需要權(quán)衡的問(wèn)題。

2.垃圾回收器設(shè)計(jì)上的考量

  • JVM在GC時(shí)不允許一邊垃圾回收浙踢,一邊還創(chuàng)建新對(duì)象(就像不能一邊打掃衛(wèi)生绢慢,還在一邊扔垃圾)。
  • JVM需要一段Stop the world的暫停時(shí)間洛波,而STW會(huì)造成系統(tǒng)短暫停頓不能處理任何請(qǐng)求胰舆;
  • 新生代收集頻率高,性能優(yōu)先蹬挤,常用復(fù)制算法缚窿;老年代頻次低,空間敏感焰扳,避免復(fù)制方式倦零。
  • 所有垃圾回收器的涉及目標(biāo)都是要讓GC頻率更少,時(shí)間更短吨悍,減少GC對(duì)系統(tǒng)影響扫茅!

3.CMS和G1

目前主流的垃圾回收器配置是新生代采用ParNew,老年代采用CMS組合的方式育瓜,或者是完全采用G1回收器葫隙,從未來(lái)的趨勢(shì)來(lái)看,G1是官方維護(hù)和更為推崇的垃圾回收器躏仇。

image

業(yè)務(wù)系統(tǒng)恋脚,延遲敏感的推薦CMS;大內(nèi)存服務(wù)钙态,要求高吞吐的慧起,采用G1回收器!下面單獨(dú)就兩款回收器的工作機(jī)制和適用場(chǎng)景進(jìn)行一下說(shuō)明:

四册倒、CMS回收器

1.CMS垃圾回收器的工作機(jī)制

CMS主要是針對(duì)老年代的回收器蚓挤,新生代的采用ParNew回收器,工作流程就是上文提到的經(jīng)典復(fù)制算法驻子,在三塊區(qū)中進(jìn)行流轉(zhuǎn)回收灿意,只不過(guò)采用多線程并行的方式加快了MinorGC速度。老年代是標(biāo)記-清除崇呵,默認(rèn)會(huì)在一次FullGC算法后做整理算法缤剧,清理內(nèi)存碎片。

image

優(yōu)點(diǎn):并發(fā)收集域慷、主打“低延時(shí)” 荒辕。在最耗時(shí)的兩個(gè)階段都沒(méi)有發(fā)生STW汗销,而需要STW的階段都以很快速度完成。
缺點(diǎn):1抵窒、消耗CPU弛针;2、浮動(dòng)垃圾李皇;3削茁、內(nèi)存碎片
適用場(chǎng)景:重視服務(wù)器響應(yīng)速度,要求系統(tǒng)停頓時(shí)間最短掉房。

2.登錄系統(tǒng)的壓測(cè)前配置

調(diào)優(yōu)場(chǎng)景以之前的登錄系統(tǒng)為例茧跋,按照之前容量估算套路,引入性能壓測(cè)環(huán)節(jié)卓囚,測(cè)試同學(xué)對(duì)登錄接口壓至1s內(nèi)60M的對(duì)象生成速度瘾杭,假設(shè)只配置了4C8G的機(jī)器配置,采用ParNew+CMS的組合回收器捍岳,堆內(nèi)存分配4g富寿,線程棧默認(rèn)1M,初始配置如下:

-Xms4g –Xmx4g –Xmn1536m -Xss1m -XX:+UseConcMarkSweepGC

劃分Eden和Surviror大小锣夹,如按照默認(rèn)-XX:SurvivorRatio=8分配規(guī)則页徐,基于CMS的JVM運(yùn)行模型粗略計(jì)算如下:

image

基本上,可以看到20S后Eden區(qū)就滿了银萍,此時(shí)再運(yùn)行的時(shí)候?qū)ο笠呀?jīng)無(wú)法分配变勇,會(huì)觸發(fā)MinorGC,假設(shè)在這次GC后S1裝入100M贴唇,馬上過(guò)20S又會(huì)觸發(fā)一次MinorGC搀绣,多出來(lái)的100M存活對(duì)象+S1區(qū)的100M已經(jīng)無(wú)法順利放入到S2區(qū),此時(shí)就會(huì)觸發(fā)JVM的動(dòng)態(tài)年齡機(jī)制戳气,將一批100M左右的對(duì)象推到老年代保存链患,持續(xù)運(yùn)行一段時(shí)間,系統(tǒng)可能一個(gè)小時(shí)候內(nèi)就會(huì)觸發(fā)一次FullGC瓶您。

3.基于CMS的調(diào)優(yōu)思路

首先采取上調(diào)Survior區(qū)容量策略:新生代劃2g麻捻,維持E:S1:S2=8:1:1,此時(shí)Eden=1.6G呀袱,S=200M贸毕。60M/S速率,25s觸發(fā)MinorGC夜赵,回收的垃圾超過(guò)200M才觸發(fā)進(jìn)入老年代明棍,對(duì)象進(jìn)入老年代的幾率大大降低,短命對(duì)象在幾次minorGC后就釋放掉了寇僧。

此時(shí)的JVM配置如下:

-Xms4g –Xmx4g –Xmn2g -Xss1m -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC

然后再下調(diào)晉升老年代年齡摊腋,默認(rèn)為15——當(dāng)躲過(guò)15次MinorGC后沸版,可進(jìn)入老年代;可適當(dāng)調(diào)低改值為5~10兴蒸,讓長(zhǎng)壽對(duì)象應(yīng)盡快去往屬于它的地方推穷,而不是在新生代來(lái)回折騰,占用空間类咧,這樣可以優(yōu)化每次MinorGC的耗時(shí)。

-Xms4g –Xmx4g –Xmn2g -Xss1m -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=15   -XX:+UseConcMarkSweepGC

再選擇性的去優(yōu)化老年代參數(shù):比如老年代默認(rèn)在標(biāo)記清除以后會(huì)做整理蟹腾,還可以在CMS的增加GC頻次還是增加GC時(shí)長(zhǎng)上做些取舍痕惋,如下是響應(yīng)優(yōu)先的參數(shù)調(diào)優(yōu):

image

那么最終我們可以得到一個(gè)比較適用于自身業(yè)務(wù)系統(tǒng)的、基于CMS回收器的JVM參數(shù):

-Xms4g –Xmx4g –Xmn2g -Xss1m -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=5   
-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -XX:+AlwaysPreTouch

五娃殖、G1垃圾回收器


1.CMS回收器的不足

  • 服務(wù)啟動(dòng)前就需要指定新生代和老年代大小值戳,啟動(dòng)了就不能動(dòng)態(tài)調(diào)整了!
  • 新生代和老年代都必須分配獨(dú)立且連續(xù)的一整塊內(nèi)存空間炉爆!
  • 所有針對(duì)老年代的操作必須掃描整個(gè)老年代空間堕虹,相同的老年代對(duì)象,堆空間越大掃描耗時(shí)越長(zhǎng)芬首!

2.G1回收器的設(shè)計(jì)思路

G1回收天然的適用于大內(nèi)存服務(wù)器赴捞,首先G1將堆內(nèi)存空間拆分為多個(gè)大小相等的Region塊,Region的個(gè)數(shù)默認(rèn)2048個(gè)郁稍,配置4g堆內(nèi)存赦政,每個(gè)region的大小就為2M。Region動(dòng)態(tài)的屬于老年代或者新生代耀怜,上一秒還是分配成新生代恢着,經(jīng)過(guò)回收以后空出來(lái),下一秒有可能被分為老年代區(qū)财破。

在G1回收器這里已經(jīng)不需要再提前設(shè)置新生代和老年代的大小掰派,但是新生代仍區(qū)分Eden和Survivor區(qū)。大大降低了JVM參數(shù)的調(diào)優(yōu)復(fù)雜度左痢,只需配置-XX:MaxGCPauseMillis=n(ms)靡羡,設(shè)置最大GC停頓時(shí)間,剩下的交給G1回收器抖锥。G1會(huì)自動(dòng)追蹤每個(gè)region可以回收的大小和預(yù)估的時(shí)間亿眠,最后在真正垃圾回收的時(shí)候,盡量把垃圾回收控制在設(shè)置的時(shí)間范圍內(nèi)磅废,在有限的時(shí)間內(nèi)回收更多的對(duì)象纳像。

image

所以綜合來(lái)看,G1主打高吞吐拯勉,特別適用多核竟趾、大內(nèi)存服務(wù)(如Kafka/ElasticSearch)憔购。

3.G1的工作機(jī)制

新生代回收:對(duì)象優(yōu)先分配Eden的Region,JVM不停給新生代分配更多的region岔帽,直到新生代占堆總大小的60%玫鸟,觸發(fā)MinorGC。

進(jìn)入老年代對(duì)象的條件不變:達(dá)到晉升年齡犀勒;動(dòng)態(tài)年齡判定屎飘;大對(duì)象等

Mix混合回收:當(dāng)老年代的Region占堆內(nèi)存的45%以后,觸發(fā)MixGC贾费,會(huì)分階段多次混合回收新生代和老年代的Region钦购。

Full GC:MixGC時(shí)發(fā)現(xiàn)無(wú)可用的新Region塊了來(lái)分配復(fù)制的存活對(duì)象,立馬觸發(fā)FullGC褂萧,停止系統(tǒng)程序押桃,單線程標(biāo)記、清除和整理导犹,空閑出一批Region唱凯,過(guò)程很緩慢。

image

4.G1的核心調(diào)優(yōu)參數(shù)

G1收集器自身已經(jīng)有一套預(yù)測(cè)和調(diào)整機(jī)制了谎痢,因此我們首先的選擇是相信它磕昼,即調(diào)整-XX:MaxGCPauseMillis=N參數(shù),這也符合G1的目的——讓GC調(diào)優(yōu)盡量簡(jiǎn)單舶得!同時(shí)也不要自己顯式設(shè)置新生代的大嘘獭(用-Xmn或-XX:NewRatio參數(shù)),如果人為干預(yù)新生代的大小沐批,會(huì)導(dǎo)致目標(biāo)時(shí)間這個(gè)參數(shù)失效纫骑。

image

針對(duì)-XX:MaxGCPauseMillis來(lái)說(shuō),參數(shù)的設(shè)置帶有明顯的傾向性:
調(diào)低↓:延遲更低九孩,但MinorGC頻繁先馆,MixGC回收老年代區(qū)減少,增大Full GC的風(fēng)險(xiǎn)躺彬。
調(diào)高↑:?jiǎn)未位厥崭嗟膶?duì)象煤墙,但系統(tǒng)整體響應(yīng)時(shí)間也會(huì)被拉長(zhǎng)。

針對(duì)InitiatingHeapOccupancyPercent來(lái)說(shuō)宪拥,調(diào)參大小的效果也不一樣:
調(diào)低↓: 更早觸發(fā)MixGC仿野,浪費(fèi)cpu。
調(diào)高↑:堆積過(guò)多代回收region她君,增大FullGC的風(fēng)險(xiǎn)脚作。

5.G1調(diào)優(yōu)在Kafka集群的應(yīng)用

比如日志平臺(tái)的Kafka集群每秒寫(xiě)入300M數(shù)據(jù)至內(nèi)存,broker節(jié)點(diǎn)的配置為16C32G,假設(shè)堆內(nèi)存給16g球涛,新生代分配8g劣针,每秒產(chǎn)生對(duì)象假設(shè)100M左右,差不多一分多鐘就會(huì)產(chǎn)生一次MinorGC亿扁,CMS機(jī)制下需要等Eden滿了以后捺典,才一次性清理大約8g左右的垃圾對(duì)象,差不多會(huì)有秒級(jí)的STW停頓从祝,如果是老年代的GC延時(shí)長(zhǎng)則會(huì)有十秒級(jí)的STW停頓襟己。

-Xms16g –Xmx16g –Xmn8g -Xss1m -XX:+UseConcMarkSweepGC

假設(shè)采用了G1回收器,適當(dāng)調(diào)低最大耗時(shí)牍陌,設(shè)定MaxGCPauseMillis為100ms稀蟋,并且適當(dāng)調(diào)低堆使用率閾值,G1就會(huì)在允許的響應(yīng)時(shí)間內(nèi)自動(dòng)的呐赡、多批次的去進(jìn)行垃圾回收,保證每個(gè)STW的時(shí)間都不會(huì)太長(zhǎng)骏融。

-Xms16g -Xmx16g -Xss1m -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:InitiatingHeapOccupancyPercent=40

所以線上的kafka和ES集群链嘀,動(dòng)輒32~64g的大內(nèi)存,如果讓CMS去整塊回收十多G乃至幾十G的垃圾對(duì)象档玻,對(duì)于系統(tǒng)而言絕對(duì)不利怀泊!一般來(lái)說(shuō),堆內(nèi)存超過(guò)8g的大內(nèi)存服務(wù)器误趴,都更推薦使用G1回收器霹琼!

六、調(diào)優(yōu)總結(jié)


1.系統(tǒng)在上線前的綜合調(diào)優(yōu)思路

  • 業(yè)務(wù)預(yù)估:根據(jù)預(yù)期的并發(fā)量凉当、平均每個(gè)任務(wù)的內(nèi)存需求大小枣申,然后評(píng)估需要幾臺(tái)機(jī)器來(lái)承載,每臺(tái)機(jī)器需要什么樣的配置看杭。
  • 容量預(yù)估:根據(jù)系統(tǒng)的任務(wù)處理速度忠藤,然后合理分配Eden、Surivior區(qū)大小楼雹,老年代的內(nèi)存大小模孩。
  • 回收器選型:響應(yīng)優(yōu)先的系統(tǒng),建議采用ParNew+CMS回收器贮缅;吞吐優(yōu)先榨咐、多核大內(nèi)存(heap size≥8G)服務(wù),建議采用G1回收器谴供。
  • 優(yōu)化思路:讓短命對(duì)象在MinorGC階段就被回收(同時(shí)回收后的存活對(duì)象<Survivor區(qū)域50%块茁,可控制保留在新生代),長(zhǎng)命對(duì)象盡早進(jìn)入老年代憔鬼,不要在新生代來(lái)回復(fù)制龟劲;盡量減少Full GC的頻率胃夏,避免FGC系統(tǒng)的影響。

到目前為止昌跌,總結(jié)到的調(diào)優(yōu)的過(guò)程主要基于上線前的測(cè)試驗(yàn)證階段仰禀,所以我們盡量在上線之前,就將機(jī)器的JVM參數(shù)設(shè)置到最優(yōu)蚕愤!

2.一份通用的JVM參數(shù)模板

一般來(lái)說(shuō)答恶,大企業(yè)或者架構(gòu)師團(tuán)隊(duì),都會(huì)為項(xiàng)目的業(yè)務(wù)系統(tǒng)定制一份較為通用的JVM參數(shù)模板萍诱,但是許多小企業(yè)和團(tuán)隊(duì)可能就疏于這一塊的設(shè)計(jì)悬嗓,如果老板某一天突然讓你負(fù)責(zé)定制一個(gè)新系統(tǒng)的JVM參數(shù),你上網(wǎng)去搜大量的JVM調(diào)優(yōu)文章或博客裕坊,結(jié)果發(fā)現(xiàn)都是零零散散的包竹、不成體系的JVM參數(shù)講解,根本下不了手籍凝,這個(gè)時(shí)候你就需要一份較為通用的JVM參數(shù)模板了周瞎,不能保證性能最佳,但是至少能讓JVM這一層是穩(wěn)定可控的饵蒂,我在這里給大家總結(jié)了兩份模板:

基于4C8G系統(tǒng)的ParNew+CMS回收器模板(響應(yīng)優(yōu)先)声诸,新生代大小根據(jù)業(yè)務(wù)靈活調(diào)整!

-Xms4g
-Xmx4g
-Xmn2g
-Xss1m
-XX:SurvivorRatio=8
-XX:MaxTenuringThreshold=10
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=70
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+AlwaysPreTouch
-XX:+HeapDumpOnOutOfMemoryError
-verbose:gc
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-Xloggc:gc.log

基于8C16G系統(tǒng)的G1回收器模板(吞吐優(yōu)先):

-Xms8g
-Xmx8g
-Xss1m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=150
-XX:InitiatingHeapOccupancyPercent=40
-XX:+HeapDumpOnOutOfMemoryError
-verbose:gc
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-Xloggc:gc.log

以上兩份模板參數(shù)退盯,都額外增加了GC日志打印彼乌、OOM自動(dòng)dump等配置內(nèi)容。

這篇文章的最后渊迁,再多說(shuō)幾句啊慰照,雖然本文主題是JVM實(shí)戰(zhàn)與調(diào)優(yōu),但需知JVM調(diào)優(yōu)只是一個(gè)手段琉朽,但并不一定所有問(wèn)題都可以通過(guò)JVM進(jìn)行調(diào)優(yōu)解決焚挠,大多數(shù)的Java應(yīng)用不需要進(jìn)行JVM優(yōu)化,我們可以遵循以下的一些原則:

  • 上線之前漓骚,應(yīng)先考慮將機(jī)器的JVM參數(shù)設(shè)置到最優(yōu)蝌衔;
  • 減少創(chuàng)建對(duì)象的數(shù)量(代碼層面);
  • 減少使用全局變量和大對(duì)象(代碼層面)蝌蹂;
  • 優(yōu)先架構(gòu)調(diào)優(yōu)和代碼調(diào)優(yōu)噩斟,JVM優(yōu)化是不得已的手段(代碼、架構(gòu)層面)孤个;
  • 分析GC情況優(yōu)化代碼比優(yōu)化JVM參數(shù)更好(代碼層面)剃允;

通過(guò)以上原則,我們發(fā)現(xiàn),其實(shí)最有效的優(yōu)化手段是架構(gòu)和代碼層面的優(yōu)化斥废,而JVM優(yōu)化則是最后不得已的手段椒楣,也可以說(shuō)是對(duì)服務(wù)器配置的最后一次“壓榨”。

轉(zhuǎn)載;http://www.reibang.com/p/63853a33e4c0

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末牡肉,一起剝皮案震驚了整個(gè)濱河市捧灰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌统锤,老刑警劉巖毛俏,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異饲窿,居然都是意外死亡煌寇,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)逾雄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)阀溶,“玉大人,你說(shuō)我怎么就攤上這事鸦泳√视矗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵辽故,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我腐碱,道長(zhǎng)誊垢,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任症见,我火速辦了婚禮喂走,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谋作。我一直安慰自己芋肠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布遵蚜。 她就那樣靜靜地躺著帖池,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吭净。 梳的紋絲不亂的頭發(fā)上睡汹,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音寂殉,去河邊找鬼囚巴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的彤叉。 我是一名探鬼主播庶柿,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼秽浇!你這毒婦竟也來(lái)了浮庐?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤兼呵,失蹤者是張志新(化名)和其女友劉穎兔辅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體击喂,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡维苔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了懂昂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片介时。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖凌彬,靈堂內(nèi)的尸體忽然破棺而出沸柔,到底是詐尸還是另有隱情,我是刑警寧澤铲敛,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布褐澎,位于F島的核電站,受9級(jí)特大地震影響伐蒋,放射性物質(zhì)發(fā)生泄漏工三。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一先鱼、第九天 我趴在偏房一處隱蔽的房頂上張望俭正。 院中可真熱鬧,春花似錦焙畔、人聲如沸掸读。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)儿惫。三九已至,卻和暖如春伸但,著一層夾襖步出監(jiān)牢的瞬間姥闪,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工砌烁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留筐喳,地道東北人催式。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像避归,于是被迫代替她去往敵國(guó)和親荣月。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355