JVM之堆(Heap)

一、堆的核心特性

  1. 唯一性與共享性
    每個JVM實例僅有一個堆,所有線程共享,但可通過線程私有緩沖區(TLAB)減少多線程分配沖突。
  2. 內存結構演變
    • JDK 7及之前:堆分為新生代(Young)、老年代(Old)、永久代(Perm)。
    • JDK 8及之后:永久代被元空間(Metaspace)取代,元空間使用本地內存,不再受堆大小限制。
    • 新生代細分:Eden區 + 兩個Survivor區(S0/S1),默認比例8:1:1。

二、對象分配與回收機制

  1. 對象分配策略
    • 優先Eden分配:新對象默認在Eden區分配,空間不足觸發Minor GC。
    • 大對象直接晉升:通過-XX:PretenureSizeThreshold設置,大對象直接進入老年代,避免頻繁復制。
    • 年齡閾值晉升:Survivor區對象經歷-XX:MaxTenuringThreshold(默認15次)Minor GC后晉升至老年代。
    • 動態年齡判定:若Survivor區某年齡對象總和超過其50%,則該年齡及以上對象直接晉升。
  2. 垃圾回收類型
    類型作用區域觸發條件算法
    Minor GC新生代Eden區滿復制算法
    Major GC老年代老年代空間不足標記-清除-整理
    Full GC整堆(含元空間)晉升失敗/元空間溢出標記-清除-整理
    Minor GC最頻繁,Full GC導致最長STW(Stop-The-World)停頓。

三、關鍵參數配置

  1. 堆大小設置
    • -Xms:初始堆大小(默認物理內存/64)
    • -Xmx:最大堆大小(默認物理內存/4)
      建議:-Xms=-Xmx避免擴容開銷。
  2. 分代比例調整
    • -XX:NewRatio:新生代與老年代比例(如4表示1:4)。
    • -XX:SurvivorRatio:Eden與Survivor比例(如8表示8:1:1)。
  3. 元空間管理
    • -XX:MetaspaceSize:初始元空間大小
    • -XX:MaxMetaspaceSize:元空間上限(默認不限制)。

四、優化與問題排查

  1. 性能調優策略
    • 逃逸分析:JIT編譯器識別未逃逸出線程/方法的對象,支持棧上分配減少堆壓力。
    • TLAB優化:線程預分配內存塊(默認開啟-XX:+UseTLAB),提升并發分配效率。
    • GC選擇:根據場景選擇收集器(如G1平衡吞吐與停頓,ZGC低延遲)。
  2. 常見OOM類型與解決
    錯誤類型原因解決方案
    Java heap space堆內存不足(泄漏或配置過小)增大-Xmx,使用MAT分析堆轉儲
    Metaspace元空間溢出(動態類加載過多)增大-XX:MaxMetaspaceSize
    GC overhead limit exceeded98%時間用于GC但回收<2%內存檢查內存泄漏,調整分代比例

五、工具與監控

  • 實時監控:jstat -gcutil 查看GC統計,jmap -dump 生成堆快照。
  • 深度分析:MAT(Eclipse Memory Analyzer)定位泄漏根源。
    通過合理配置堆參數、優化對象生命周期管理,可顯著提升應用性能并避免內存問題。實際調優需結合監控數據與業務場景綜合調整。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96669.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96669.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96669.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

單片機的RAM與ROM概念

RAM與ROM1、RAM與ROM2、 bss、data、heap、stack、text詳細講解3、詳細探討 TCM、OCRAM 和 HBNRAM 之間的區別及其具體作用。3.1、TCM&#xff08;Tightly Coupled Memory&#xff09;3.2、 OCRAM&#xff08;On Chip RAM&#xff09;3.3、HBNRAM (Hibernate RAM)3.4、總結1、R…

實驗3:事件處理(2學時)

實驗目的&#xff08;1&#xff09;熟練掌握 v-on 指令的用法&#xff0c;學會使用 v-on 指令監聽 DOM 元素的事件&#xff0c;并通過該事件觸發調用事件處理程序。&#xff08;2&#xff09;掌握v-on 指令修飾符的基本用法。實驗內容實現購物車功能的拓展&#xff08;商品數量…

商品庫存扣減方案

文章目錄1. Lua腳本 Redis&#xff08;業界首選&#xff0c;綜合最優&#xff09;2. Redis原子命令&#xff08;DECRBY 結果校驗&#xff09;3. Redis事務&#xff08;MULTI/EXEC&#xff09;4. 分布式鎖&#xff08;基于Redis實現&#xff09;5. Redisson客戶端封裝&#xf…

關于在阿里云DMS誤操作后如何恢復數據的記錄

前言 昨天因客戶員工操作錯誤&#xff0c;導致快遞單號和訂單互換。客戶員工那邊讓筆記修改數據。 于是筆者寫下如下SQL來操作&#xff0c;導致了災難性事故。 update t_order_fed_ex_record set tracking_number 884102170661, master_tracking_number 884102170661, push…

【操作系統核心知識梳理】線程(Thread)重點與易錯點全面總結

在多任務操作系統中&#xff0c;線程是比進程更輕量的執行單元&#xff0c;理解線程的特性和實現方式是掌握并發編程的基礎。本文系統梳理了線程相關的核心知識點和常見誤區&#xff0c;助你夯實操作系統基礎。一、線程的基本概念與引入目的 1.1 什么是線程&#xff1f; 線程是…

深入理解 Python 中的 `__call__` 方法

化身為可調用的對象&#xff1a;深入理解 Python 中的 __call__ 方法 引言&#xff1a;函數與對象的邊界模糊化 在 Python 中&#xff0c;我們最熟悉的概念莫過于函數&#xff08;Function&#xff09; 和對象&#xff08;Object&#xff09;。函數是可調用的&#xff08;calla…

云服務器使用代理穩定與github通信方法

使用SSH反向隧道 (SSH Reverse Tunneling) 利用SSH連接在您的本地電腦和云服務器之間建立一個反向的加密通道。 原理&#xff1a; 從本地電腦發起一個SSH命令到您的云服務器&#xff0c;這個命令會告訴云服務器&#xff1a;“請監聽您自己的某個端口&#xff08;例如&#xff1…

7.k8s四層代理service

Service的基本介紹 Cluster IP&#xff1a;每個 Service 都分配了一個Cluster IP&#xff0c;它是一個虛擬的內部IP地址&#xff0c;用于在集群內部進行訪問。這個虛擬IP是由Kubernetes自動分配的&#xff0c;并且與Service對象一一對應。 端口映射&#xff1a;Service可以映射…

Qt 工程中 UI 文件在 Makefile 中的處理

Qt 工程中 UI 文件在 Makefile 中的處理 在 Qt 工程中&#xff0c;.ui 文件&#xff08;Qt Designer 界面文件&#xff09;需要通過 uic&#xff08;用戶界面編譯器&#xff09;工具轉換為對應的頭文件。以下是幾種情況下如何處理 UI 文件&#xff1a;1. 使用 qmake 自動生成 M…

ZLMediaKit性能測試

一、環境 系統&#xff1a;虛擬機 Ubuntu22.04 64bit配置: 4核8G設置&#xff1a;ulimit -n 102400 二、安裝 依賴安裝sudo apt update sudo apt install ffmpeg sudo apt install nloadzlm服務安裝參考&#xff1a;https://blog.csdn.net/hanbo622/article/details/149064939?…

智能文檔處理業務,應該選擇大模型還是OCR專用小模型?

智能文檔處理業務中&#xff0c;最佳策略不是二選一&#xff0c;而是“大小模型協同”。用專用小模型處理高頻、標準化的核心文檔流&#xff0c;實現極致效率與成本控制&#xff1b;用大模型賦能非標、長尾文檔的靈活處理&#xff0c;加速業務創新。 OCR小模型會被大模型取代嗎…

android 如何判定底部導航欄顯示時 不是鍵盤顯示

在 Android 中判定底部導航欄是否顯示時&#xff0c;核心痛點是 區分 “導航欄的底部 Insets” 和 “軟鍵盤彈出的底部 Insets”—— 兩者都會導致 getSystemWindowInsetBottom() 返回非零值&#xff0c;直接判斷會誤將鍵盤彈出當成導航欄顯示。以下是基于 WindowInsets 類型區…

你知道服務器和電腦主機的區別嗎?

我們都知道服務器和臺式主機有著不同之處&#xff0c;但具體說出個一二三來很多人還是一頭霧水&#xff0c;也就是知其然不知其所以然&#xff0c;都是CPU主板 內存 硬盤 電源&#xff0c;撐死就差一個顯卡不同&#xff0c;但其實服務器和我們正常使用的臺式主機差距很大&#…

什么是包裝類

什么是包裝類 在Java中&#xff0c;包裝類&#xff08;Wrapper Class&#xff09;是為基本數據類型提供的對應的引用類型。Java中的基本數據類型&#xff08;如int、char、boolean等&#xff09;不是對象&#xff0c;為了在需要對象的場景中使用基本數據類型&#xff08;如集合…

用Python打造專業級老照片修復工具:讓時光倒流的數字魔法

在這個數字化時代&#xff0c;我們手中珍藏著許多泛黃、模糊、甚至有劃痕的老照片。這些照片承載著珍貴的回憶&#xff0c;但時間的侵蝕讓它們失去了往日的光彩。今天&#xff0c;我將帶您一起用Python開發一個專業級的老照片修復工具&#xff0c;讓這些珍貴的記憶重現光彩。為…

linux中查找包含xxx內容的文件

linux中怎么查找哪個文件包含xxx內容 在Linux中查找包含特定內容的文件 在Linux系統中&#xff0c;有幾種常用方法來查找包含特定內容的文件。以下是幾種最有效的方法&#xff1a;1. 使用 grep 命令&#xff08;最常用&#xff09; 基本語法&#xff1a;bash grep -r "搜索…

sklearn 加州房價數據集 fetch_california_housing 出錯 403: Forbidden 修復方案

問題 加載加州房價數據時出現 403 錯誤 HTTP Error 403: Forbidden from sklearn.datasets import fetch_california_housingcalifornia fetch_california_housing() print(california.target.shape) 解決方案 運行下述代碼&#xff0c;然后再運行上述的 fetch_california_hou…

嵌入式學習---(硬件)

1、在LED實驗中&#xff0c;在對Soc引腳配置時都做了哪些工作&#xff1f;復用功能配置操作寄存器&#xff1a;IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03將引腳的低 4 位設置為 0101&#xff0c;將引腳復用為 GPIO 功能電氣特性配置操作寄存器&#xff1a;IOMUXC_SW_PAD_CTL_PAD_GPIO1…

微信小程序開發教程(十一)

目錄&#xff1a;1.上拉觸底案例-初步實現上拉觸底效果2.上拉觸底案例-添加loading效果3.上拉觸底案例-節流處理4.擴展-自定義編譯模式1.上拉觸底案例-初步實現上拉觸底效果頁面加載的時候調用這個方法&#xff1a;設置樣式&#xff1a;下拉觸底后繼續調用獲取顏色的方法2.上拉…

Android相機API2,基于GLSurfaceView+SurfaceTexture實現相機預覽,集成的相機算法采用GPU方案,簡要說明

Android相機API2&#xff0c;基于GLSurfaceViewSurfaceTexture實現相機預覽&#xff0c;集成的相機算法采用GPU方案&#xff0c;簡要流程如下(不疊加相機算法的預覽顯示流程也大體如此&#xff0c;只是去掉了算法部分)&#xff1a;進入相機&#xff1a;1&#xff0c;新建實現了…