成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

性能提升300%!JVM分配優(yōu)化三板斧?,JVM 的內(nèi)存區(qū)域劃分、對象內(nèi)存布局、百萬 QPS 優(yōu)化實踐

開發(fā) 前端
JVM 內(nèi)存劃分是一種典型的“空間換時間”設(shè)計哲學(xué),通過犧牲部分內(nèi)存冗余(如棧幀的獨立分配、堆的分代結(jié)構(gòu)),換取了高效的執(zhí)行速度、靈活的垃圾回收策略和穩(wěn)定的多線程環(huán)境。

內(nèi)存區(qū)域劃分

JVM 內(nèi)存可分為 線程私有 和 線程共享 兩大類區(qū)域:

圖:小豆丁技術(shù)棧圖:小豆丁技術(shù)棧

線程私有區(qū)域

  • 程序計數(shù)器(PC Register)

a.作用:記錄當前線程執(zhí)行的字節(jié)碼指令地址,確保線程切換后能恢復(fù)執(zhí)行點。

b.特點:唯一不會出現(xiàn) OutOfMemoryError的區(qū)域,生命周期與線程綁定。

  • Java 虛擬機棧(JVM Stack)
  • 作用:存儲方法調(diào)用的棧幀,包含局部變量表、操作數(shù)棧、動態(tài)鏈接等信息。
  • 異常:StackOverflowError(棧深度溢出)和 OutOfMemoryError。
  • 本地方法棧(Native Method Stack)
  • 作用:服務(wù)于 JNI 調(diào)用的本地方法(如 C/C++ 代碼),結(jié)構(gòu)與虛擬機棧類似。

線程共享區(qū)域

  • 堆(Heap)

a.新生代:包括 Eden 區(qū)和兩個 Survivor 區(qū)(From/To),用于短生命周期對象。

b.老年代:存放長期存活對象(如經(jīng)過多次 GC 仍存在的實例)。

c.作用:存儲所有對象實例和數(shù)組,是垃圾回收(GC)的核心區(qū)域。

d.結(jié)構(gòu):調(diào)優(yōu)參數(shù):通過 -Xms(初始堆大小)和 -Xmx(最大堆大小)控制容量。

  • 方法區(qū)(Method Area)/ 元空間(Metaspace)
  • 作用:存儲類元數(shù)據(jù)(如字段、方法)、常量池、靜態(tài)變量等。
  • 演變:JDK 8 后永久代(PermGen)被元空間取代,使用本地內(nèi)存,避免 OutOfMemoryError: PermGen。

其他關(guān)鍵區(qū)域

  • 直接內(nèi)存(Direct Memory)

a.作用:通過 ByteBuffer.allocateDirect()分配,繞過堆內(nèi)存直接訪問物理內(nèi)存,提升 I/O 性能。

b.特點:不屬于 JVM 管理,但溢出時仍可能引發(fā) OutOfMemoryError。

  • 運行時常量池
  • 歸屬:方法區(qū)的一部分,存儲編譯期生成的字面量和符號引用。

對象內(nèi)存布局

JVM 對象內(nèi)存布局由三部分組成:對象頭(Header)、實例數(shù)據(jù)(Instance Data)和對齊填充(Padding)。

圖片圖片

  • 對象頭(Header)對象頭結(jié)構(gòu)示意圖

圖片圖片

a.Mark Word:存儲哈希碼、GC 分代年齡、鎖狀態(tài)等(64 位系統(tǒng)占 8 字節(jié))。

b.類型指針:指向方法區(qū)的類元數(shù)據(jù)(4 字節(jié))。

c.數(shù)組長度(僅數(shù)組對象):記錄數(shù)組長度(4 字節(jié))。

  • 實例數(shù)據(jù)(Instance Data)
  • 包含對象所有成員變量(包括繼承的變量)的實際值。
  • 對齊填充(Padding)
  • 確保對象總大小為 8 字節(jié)的整數(shù)倍,滿足內(nèi)存對齊要求。

JVM 內(nèi)存劃分的設(shè)計意義

Tina:JVM 內(nèi)存劃分的設(shè)計意義是什么?

設(shè)計意義主要體現(xiàn)在以下幾個方面,其核心目標是通過對不同類型數(shù)據(jù)的分類管理,平衡性能、安全性、資源利用效率等多方面需求。

JVM 內(nèi)存劃分是一種典型的“空間換時間”設(shè)計哲學(xué),通過犧牲部分內(nèi)存冗余(如棧幀的獨立分配、堆的分代結(jié)構(gòu)),換取了高效的執(zhí)行速度、靈活的垃圾回收策略和穩(wěn)定的多線程環(huán)境。

這種設(shè)計不僅體現(xiàn)了對計算機科學(xué)底層原理的深刻理解(如棧與堆的結(jié)構(gòu)特性),也反映了工程實踐中對性能、安全性和擴展性的綜合權(quán)衡。

提升內(nèi)存管理機效率和訪問性能

堆內(nèi)存(Heap)存儲對象實例和數(shù)組,這類數(shù)據(jù)生命周期差異大(短生命周期對象與長期存活對象并存),通過劃分為新生代和老年代,結(jié)合不同的垃圾回收算法(如復(fù)制算法、標記整理算法)優(yōu)化回收效率。

棧內(nèi)存(Stack)存儲線程私有的方法調(diào)用棧幀(局部變量、操作數(shù)棧等),利用棧結(jié)構(gòu)的“先進后出”特性高效管理方法調(diào)用和返回,無需復(fù)雜內(nèi)存分配機制,訪問速度遠快于堆。

線程私有的區(qū)域(如棧、程序計數(shù)器)避免了多線程競爭,無需加鎖即可快速操作,降低并發(fā)開銷。

共享區(qū)域(堆、方法區(qū))則用于存儲全局數(shù)據(jù)(如對象實例、類元信息),通過同步機制保障線程安全

優(yōu)化垃圾回收性能

JVM 基于“弱代假說”(大部分對象生命周期短),將堆劃分為新生代和老年代:

  • 新生代采用復(fù)制算法(如 Survivor 區(qū)),快速回收短期對象;
  • 老年代使用標記-清除或標記-整理算法,減少長期存活對象的回收頻率。這種設(shè)計顯著降低了垃圾回收的整體停頓時。

從永久代(PermGen)到元空間(Metaspace)的轉(zhuǎn)變,避免了永久代內(nèi)存溢出的問題,元空間使用本地內(nèi)存動態(tài)擴展,減少了對 JVM 堆的依賴。

保障線程安全與程序穩(wěn)定性

程序計數(shù)器為每個線程記錄獨立的執(zhí)行指令地址,確保線程切換后能正確恢復(fù)執(zhí)行。

本地方法棧與 Java 虛擬機棧分離,避免 Java 方法調(diào)用與本地代碼(如 C/C++)的棧操作沖突。

不同區(qū)域的異常類型(如堆的 OutOfMemoryError、棧的 StackOverflowError)幫助開發(fā)者快速定位問題根源。例如,棧溢出通常由無限遞歸引起,而堆溢出多因?qū)ο笪醇皶r釋放

支持多語言與系統(tǒng)交互的擴展性

本地方法棧的兼容性:為 JNI 調(diào)用提供獨立棧空間,支持與 C/C++ 等語言的交互,擴展 Java 的底層資源訪問能力(如操作系統(tǒng) API)。

直接內(nèi)存的高效 I/O:通過堆外內(nèi)存(Direct Memory)減少數(shù)據(jù)在 Java 堆與 Native 堆間的復(fù)制開銷,提升 NIO 等高性能操作的效率。

動態(tài)性與資源利用的平衡

元數(shù)據(jù)的靈活管理:方法區(qū)存儲類元信息、常量池等數(shù)據(jù),支持類的動態(tài)加載和卸載,避免重復(fù)加載類定義,節(jié)省內(nèi)存。

內(nèi)存分配策略的適配:JVM 允許通過參數(shù)(如 -Xmx、-Xss)調(diào)整各區(qū)域大小,開發(fā)者可根據(jù)應(yīng)用特性優(yōu)化內(nèi)存分配(如高并發(fā)場景需增大棧容量)。

JVM 高效內(nèi)存分配策略

Tina:在 Java 多線程環(huán)境下,頻繁的對象分配若直接操作共享堆內(nèi)存,會因全局鎖競爭導(dǎo)致性能瓶頸。JVM 如何高效分配內(nèi)存呢?

TLAB(線程本地分配緩沖區(qū))

使用 TLAB(線程本地分配緩沖區(qū))實現(xiàn)內(nèi)存分配,TLAB 通過為每個線程在堆內(nèi)存的 Eden 區(qū)分配獨立的小塊內(nèi)存(默認 64KB-1MB),實現(xiàn)無鎖化分配,減少同步開銷。

例如,線程 A 在自己的 TLAB 中分配對象時,僅需移動內(nèi)部指針,無需與其他線程競爭堆內(nèi)存鎖。

核心工作機制

分配流程:對象優(yōu)先在 TLAB 中分配(指針碰撞方式);若空間不足,觸發(fā) TLAB Refill 操作,從 Eden 區(qū)申請新 TLAB 塊或退化為全局堆分配(需加鎖)。

內(nèi)存回收:TLAB 生命周期與線程綁定,未用完的空間在 GC 時統(tǒng)一回收,可能產(chǎn)生內(nèi)存碎片但通過“填充 Dummy 對象”優(yōu)化對齊。

調(diào)優(yōu)關(guān)鍵參數(shù)

  • -XX:TLABSize:初始大小(默認動態(tài)調(diào)整,建議根據(jù)對象平均大小設(shè)置,如 1M)。
  • -XX:MinTLABSize:最小閾值(阿里案例中設(shè)為 1M 以降低初期分配壓力)。
  • -XX:TLABWasteTargetPercent:控制 TLAB 占 Eden 區(qū)的比例(默認 1%,高并發(fā)場景可適當提升)。優(yōu)化效果:通過調(diào)整 TLAB 初始大小,**使 QPS 從初始爬升到穩(wěn)定峰值時間縮短 50%,減少 GC 停頓約 30%**。

逃逸分析與棧上分配

逃逸分析原理

JVM 通過靜態(tài)代碼分析(編譯時)和動態(tài)行為追蹤(運行時)判斷對象作用域:

  • 未逃逸對象:僅在方法內(nèi)部使用(如局部變量),可進行棧上分配。
  • 方法逃逸:對象作為返回值或參數(shù)傳遞到其他方法 → 堆分配。
  • 線程逃逸:對象被其他線程訪問(如存入全局集合) → 堆分配。
public void processOrder() {
    User user = new User();  // 無逃逸,棧上分配
    user.setId(100);
    // 對象未傳遞到外部
}

棧上分配:將未逃逸對象直接分配在棧幀中,隨方法調(diào)用結(jié)束自動銷毀,避免堆內(nèi)存分配與 GC 開銷(如循環(huán)內(nèi)臨時對象)。

標量替換:將對象拆解為基本類型變量(如User對象拆為int age),消除對象頭占用空間(實驗顯示內(nèi)存節(jié)省約 40%)。

同步消除:若對象僅被單線程訪問,JIT 編譯器自動移除synchronized塊(如局部鎖對象)。

JVM 參數(shù):

  • -XX:+DoEscapeAnalysis(啟用逃逸分析)
  • -XX:+PrintEscapeAnalysis(輸出分析日志)

性能對比:棧上分配較堆分配減少 30%的 GC 壓力

百萬 QPS 優(yōu)化實踐:TLAB 與參數(shù)調(diào)優(yōu)

面試官:面對百萬級請求,如何進行 JVM 調(diào)優(yōu)?

面試時如果被問到這類問題,首先要做的就是問清楚背景,背景無非以下幾個角度:業(yè)務(wù)、請求量、部署服務(wù)器等。

  • 業(yè)務(wù):目標服務(wù)主要用于處理登錄請求。
  • 請求量:請求量級每天百萬級,且存在流量高峰期,高峰期持續(xù)時間 1-2 小時,高峰 QPS3000,其余時間 QPS 為 30。
  • 部署服務(wù)器:服務(wù)部署的容器內(nèi)存為 8G,單節(jié)點部署。

調(diào)優(yōu)分析

登錄請求結(jié)構(gòu)通常不會太復(fù)雜,假設(shè)有 10 個字段,300 字節(jié)。由于登錄操作,同時會進行網(wǎng)絡(luò)通信、數(shù)據(jù)庫操作、緩存操作等,預(yù)設(shè)占用內(nèi)存擴大為 50 倍。那么每次請求大約占用 1.5K。

非流量高峰期 QPS30,每秒約 45K。流量高峰時段 QPS3000,每秒約 4.5M。

假設(shè) 8G 機器,分配 4G 堆內(nèi)存,其中新生代 2G。那么流量高峰期 450 秒就會打滿新生代,進行 MinorGC。

登錄服務(wù),不會處理復(fù)雜的業(yè)務(wù)邏輯,只進行通用鑒權(quán),接口耗時會比較短。這意味著內(nèi)存中大部分對象是朝生夕死,廣泛存在于新生代。

調(diào)優(yōu)策略

作為登錄服務(wù),新生代對象的創(chuàng)建和銷毀比較頻繁,大多數(shù)對象朝生夕死,同時登錄請求要求快速響應(yīng),這意味著對新生代的要求較高。同時新生代垃圾回收主要采用復(fù)制算法,碎片問題相對較少,因此我們主要關(guān)注的是 STW 時長和吞吐量。

在眾多新生代垃圾收集器中,Serial、ParNew、Parallel Scavenge 以及支持整堆回收的 G1 都是常見的選擇。首先排除 Serial,單線程垃圾回收,效率低下。

G1 是服務(wù)器風(fēng)格的垃圾收集器,針對的是具有大內(nèi)存的多處理器服務(wù)器。追求實現(xiàn)高吞吐量的同時,最大程度降低垃圾回收時 STW 時間目標。

所以該場景下優(yōu)先選擇 G1 垃圾回收器,并設(shè)置一些調(diào)優(yōu)。

  • -XX:+USEG1G:使用 G1 垃圾回收器。
  • -XX:G1HeapReginotallow=16M,減少大對象直接進入老年代的概率。
  • -XX:MaxGCPauseMillis=100,限制 GC 最大停頓時間。
  • TLAB 動態(tài)調(diào)整

a.設(shè)置-XX:MinTLABSize=1M,避免初期頻繁 Refill(默認 64KB 易導(dǎo)致慢分配)。

b.啟用-XX:+ResizeTLAB,允許 JVM 根據(jù)分配速率自動調(diào)整 TLAB 大小(動態(tài)平衡碎片與效率)。

  • 逃逸分析輔助:通過-XX:+DoEscapeAnalysis(默認開啟)優(yōu)化 80%的臨時對象分配路徑

優(yōu)化后系統(tǒng) QPS 穩(wěn)定在百萬級,GC 頻率降至 1 次/分鐘以下,P99 延遲從 200ms 降至 50ms,CPU 利用率下降 15%。

實戰(zhàn) Checklist 與工具鏈

內(nèi)存問題檢測腳本

#!/bin/bash
# 快速檢測JVM內(nèi)存配置
echo "堆配置: -Xms$(jinfo -flag InitialHeapSize $PID | cut -d= -f2) -Xmx$(jinfo -flag MaxHeapSize $PID | cut -d= -f2)"
echo "元空間: -XX:MetaspaceSize=$(jinfo -flag MetaspaceSize $PID | cut -d= -f2)"
echo "TLAB狀態(tài): $(jinfo -flag UseTLAB $PID)"

堆外內(nèi)存泄漏排查四步法

  1. 定位嫌疑進程:top -p $PID觀察 RES 與 VIRT 差值;
  2. 分析 NIO Buffer:jcmd $PID VM.native_memory detail;
  3. 追蹤 JNI 調(diào)用:-XX:+PrintJNIResolving;
  4. Dump 分析:gdb -ex "dump memory dump.bin 0xSTART 0xEND" $PID。
責(zé)任編輯:武曉燕 來源: 碼哥跳動
相關(guān)推薦

2014-07-29 11:25:18

LinuxMySQL

2017-03-23 10:54:58

LINUXMYSQL優(yōu)化

2023-08-24 07:46:21

服務(wù)器JVM

2017-08-21 23:50:45

線上內(nèi)存OOM

2013-07-03 11:13:58

DevOps

2019-11-14 08:34:08

LinuxMySQLCPU

2021-11-26 00:00:48

JVM內(nèi)存區(qū)域

2018-04-08 08:45:53

對象內(nèi)存策略

2024-11-15 09:14:23

JDK4NIO函數(shù)

2011-03-09 15:23:25

Windows Ser

2012-01-11 10:45:57

JavaJVM

2020-09-03 15:32:08

Wireshark數(shù)據(jù)包分析

2010-09-25 15:40:52

配置JVM內(nèi)存

2020-08-10 17:49:25

JVM內(nèi)存溢出

2024-11-13 11:12:08

JVM內(nèi)存區(qū)域

2022-05-07 11:47:36

服務(wù)器架構(gòu)

2021-03-29 17:51:00

瑞數(shù)信息攻防演練

2021-06-25 15:19:13

攻防演練

2020-11-18 08:17:14

Java源碼Class

2010-09-25 12:54:24

JVM內(nèi)存
點贊
收藏

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

主站蜘蛛池模板: 黄色小视频大全 | 中文字幕一区二区三区乱码在线 | 久久激情网 | 成人黄色网址大全 | 成人av片在线观看 | 久久国产精品72免费观看 | 中文视频在线 | 中文字幕一区二区三区不卡 | 男女羞羞视频免费 | 青青草在线播放 | 一区二区三区小视频 | 野狼在线社区2017入口 | 久久夜色精品国产 | 亚洲视频精品在线 | 欧美黄色片 | 在线日韩| 一级免费毛片 | 久久久久久久av | av国产精品毛片一区二区小说 | 97人人超碰 | 日韩在线观看视频一区 | 国产视频久久 | 在线永久看片免费的视频 | 四虎影视免费在线 | 欧美激情五月 | 日韩中文一区 | 亚洲成人精品 | 国产精品久久久精品 | 影视先锋av资源噜噜 | 中文字幕一区二区三区四区五区 | 午夜成人免费视频 | 国产精品免费在线 | 亚洲毛片网站 | 久久99精品久久久 | 色妹子综合网 | 国产精品免费播放 | av在线播放网址 | 浮生影院免费观看中文版 | 狠狠干天天干 | 久久久91精品国产一区二区精品 | 在线免费观看黄色网址 |