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

10w 級的并發(fā)場景,JVM 有哪些方面值得優(yōu)化呢?

開發(fā) 前端
今天我們來簡單聊一聊面試中常見的一個問題:要支持 10w 級以上的并發(fā)場景, JVM 有哪些方面值得優(yōu)化呢?

背景

以秒殺為例,大型電商系統(tǒng)會拆分多個微服務(wù),比如訂單服務(wù),商品服務(wù),優(yōu)惠服務(wù),庫存服務(wù),支付服務(wù)等等。

我們以下單為例,如下是簡約版下單流程

一般我們需要結(jié)合業(yè)務(wù)和已有的資源,再去評估 JVM 的 GC 頻率來作為參考:

  1. 首先結(jié)合業(yè)務(wù)流程分析,計算我們服務(wù)系統(tǒng)每秒產(chǎn)生的對象占用內(nèi)存大小。
  2. 假設(shè)我們采用服務(wù)器規(guī)模 8C*16G,估算下新生代的空間,大概多久觸發(fā) MinorGC。
  3. 為了避免頻繁的 Full GC,我們可以重新估算具體需要的機器配置和數(shù)量,給 JVM 設(shè)置多大內(nèi)存。

我們先來分析下在 10W TPS 下單場景中,我們每秒產(chǎn)生的對象占用內(nèi)存大小。

如何選擇垃圾回收器?

在選擇垃圾回收器的時候,我們需要考慮兩個指標:

  • 吞吐量:CPU 在用戶應(yīng)用程序運行的時間/(CPU 在用戶應(yīng)用程序運行的時間+CPU 垃圾回收器運行的時間)。
  • 響應(yīng)時間:平均每次 GC 的耗時。

目前主流的垃圾回收器配置是新生代采用 ParNew,老年代采用 CMS 組合的方式,雖然在 JDK8 以后更加推薦使用 G1。一般來說,對于延遲敏感的推薦 CMS;在大內(nèi)存、要求高吞吐推薦 G1。

在電商下單場景中,用戶對于些許的延遲可能會比較敏感,所以以下還是以 CMS 使用為例。

然后,我要如何設(shè)置 JVM 參數(shù)呢?

堆內(nèi)存大小設(shè)置

對于 8G 內(nèi)存,我們一般設(shè)置內(nèi)存一半給 JVM,正常的 JVM 參數(shù)設(shè)置如下

-Xms8192M -Xmx8192M Xmn2048M -Xss1M -XX:MMetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:SurvivorRatio=8

這樣設(shè)置,而在下單場景,大多對象都是短期存活的,這樣設(shè)置因為動態(tài)對象年齡判斷原則導(dǎo)致頻繁出發(fā) Full GC。
所以可以調(diào)整新生代內(nèi)存大小

-Xms8192M -Xmx8192M -Xmn4086M -Xss1M -XX:MMetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:SurvivorRatio=8

這樣就降低了對象頻繁進入老年代的問題,實際上很多優(yōu)化都是圍繞著如何減少 Full GC 去做的,就是盡可能把短期存活的對象留在 survivor 里,不要進入老年代,這樣就可以在 Minor GC 的時候回收掉這些對象,不會產(chǎn)生 Full GC,從而引發(fā) STW,影響系統(tǒng)性能。

除了新生代大小外,還有什么可以優(yōu)化呢?

常見 JVM 參數(shù)優(yōu)化

  1. 新生代動態(tài)對象年齡:默認設(shè)置為 15。本例子中每次 Minor GC 間隔 20s 左右,而在下單場景中,一般對象幾秒內(nèi)就會變成垃圾對象了,像這么長時間都還沒被回收的話,其實可以早點放到老年代,這樣也不會占用新生代的內(nèi)存了,比如通過設(shè)置參數(shù)-XX:MaxTenuringThreshold=5,那么經(jīng)歷過 5 次 Minor GC 后就會進入老年代。
  2. 針對大對象,有時我們會在本地緩存一些不常變化的配置,可結(jié)合實際業(yè)務(wù)評估這些對象大小比如會超過 2M,而且會一直存活保留,那么針對這些對象其實可以直接進入老年代,可以通過設(shè)置參數(shù)-XX:PretenureSizeThreshold=2M。
  3. 針對 CMS 的碎片整理,因為 CMS 基于標記-清除算法實現(xiàn),會產(chǎn)生內(nèi)存碎片,如果這些內(nèi)存碎片長時間不清理的話,那么老年代的內(nèi)存可用空間會降低,所以 CMS 也提供了兩個參數(shù)用于內(nèi)存碎片的整理:
  • -XX:+UseCMSCompactAtFullCollection,開啟內(nèi)存碎片整理。
  • -XX:CMSFullGCsBeforeCompaction,執(zhí)行指定次數(shù)的 Full GC 后,進行一次內(nèi)存整理壓縮整理的 Full GC。
  1. 元空間大小,Meta 區(qū)域的大小一定要指定,如果我們代碼類或引入動態(tài)生成類的技術(shù)超過元空間大小,那么會觸發(fā) Full GC,可以通過 jstat 命令查看項目生成類的大小來評估具體設(shè)置值,一般設(shè)置 256M 夠了。
  2. JIT 即時編譯,-XX:ReservedCodeCacheSize。JIT 是 JVM 一個非常重要的特性,CodeCahce 存放的就是即時編譯器所生成的二進制代碼。
  3. JVM 逃逸分析,逃逸分析也是一種優(yōu)化手段,JVM 如果分析確定一個對象不會逃逸于方法之外,那么這個對象會被分配在棧上,而不是在堆上,這樣一定程度上就可以減輕 GC 壓力。
責(zé)任編輯:姜華 來源: 碼哥跳動
相關(guān)推薦

2025-05-06 06:37:40

2024-08-06 08:13:26

2024-06-26 08:32:13

2011-06-28 15:06:09

ASP.NET網(wǎng)站優(yōu)化

2011-06-15 13:17:36

ASP.NET

2015-07-29 16:11:51

2022-11-30 08:17:41

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

2020-11-03 07:00:15

性能優(yōu)化程序員

2025-04-22 08:55:31

2021-01-11 07:40:30

中斷程序中斷函數(shù)嵌入式系統(tǒng)

2020-01-15 15:45:23

網(wǎng)絡(luò)安全網(wǎng)絡(luò)安全趨勢派拓網(wǎng)絡(luò)

2020-11-26 15:30:05

VueReac前端

2010-08-11 11:12:46

IT公司面試問題

2017-03-13 09:12:00

TCP數(shù)據(jù)結(jié)構(gòu)請求包

2018-12-10 18:00:34

2021-09-09 11:35:10

云計算醫(yī)療云計算市場

2024-03-07 17:21:12

HotSpotJVMHot Code

2013-10-16 09:42:53

虛擬桌面

2021-06-30 17:21:23

CPUMySQL性能

2013-10-21 10:51:01

認證管理VDI部署
點贊
收藏

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