【JVM-GC調優】

一、預備知識

  • 掌握GC相關的VM參數,會基本的空間調整
  • 掌握相關工具
  • 明白一點:調優跟應用、環境有關,沒有放之四海而皆準的法則

二、調優領域

  • 內存
  • 鎖競爭
  • cpu占用
  • io

三、確定目標

  • 【低延遲】:CMS、G1(低延遲、高吞吐)、ZGC(jdk12體驗) 垃圾回收器
  • 【高吞吐量】:ParallelGC 垃圾回收器

四、FullGC前后的內存占用,考慮下面幾個問題

  • 數據是不是太多?
    • resultSet = statement.sexecuteQuery(“select * from 大表”); 大量數據加載到堆內存,扛不住
  • 數據表示是否臃腫?
    • 對象圖:查詢時只查用到的字段
    • 對象大小:new Object() 都要占16個字節。Integer 24 int 4,如果內存占用過多,可以考慮從一些對象上進行瘦身,能用基本類型的就不用包裝類型
  • 是否存在內存泄漏?
    • static Map map = ,靜態的Map,不斷向里面put數據,有可能導致溢出
    • 可以加上軟、弱引用,
    • 緩存可以使用第三方緩存實現,盡量不要使用static Map map

五、新生代調優

  • 新生代特點
  1. 所有的new操作的內存分配非常廉價。
  2. 死亡對象的回收代價是零
  3. 大部分對象用過即死
  4. Minor GC的時間遠遠低于Full GC
  • 新生代越大越好嗎?
    • 新生代空間大了,老年代空間就小了。很容易觸發Full GC,暫停時間要比Minor GC暫停時間要長。
    • 新生代空間建議在四分之一以上二分之一以下
  • 晉升閾值配置得當,讓長時間存活對象盡快晉升
    在這里插入圖片描述

六、老年代調優

以CMS為例

  • CMS的老年代內存越大越好
  • 先嘗試不做調優,如果沒有Full GC那么已經很優了,否則先嘗試調優新生代
  • 觀察發生Full GC時老年代內存占用,將老年代內存預設調大1/4~1/3
    • -XX:CMSInitiatingOccupancyFraction=percent

七、案例

  1. Full GC和Minor GC頻繁
  • 分析:說明空間緊張,如果是新生代空間緊張,當我們業務高峰期來了,大量對象被創建,很快新生代空間塞滿了(幸存區空間緊張了),對象的晉升閾值就會降低,本來生存周期很短的對象,會被晉升到老年代中,進一步出發老年代垃圾回收導致Full GC頻繁發生。
  • 解決:通過檢查工具檢查堆空間大小,確實發現新生代空間太小了,試著增大新生代內存(增加幸存區空間,增大晉升閾值),這樣使一些生命周期較短的對象盡可能留在新生代,而不進入老年代,進而減少了老年代Full GC的發生
  1. 請求高峰期發生Full GC,單次暫停時間特別長(CMS)
  • 分析:到底是哪部分暫停時間特別長,查看GC日志,初始標記和并發標記都是比較快的,耗時的時重新標記(CMS在重新標記的時候會掃描整個的堆內存:需要掃描老年代和新生代內存),由于高峰期,新生代可能存在大量對象,導致重新標記會很慢。
  • 解決:在重新標記之前,可以先對新生代做一次垃圾回收,減少新生代對象數量,再次重新標記的時候,速度就快了
    在這里插入圖片描述
  1. 老年代充裕情況下,發生Full GC(CMS jdk1.7)
  • 分析:導致Full GC的原因:1.空間不足,導致并發失敗。2.空間碎片比較多。從CG日志看沒有并發失敗或者碎片過多導致的提示。說明老年代內存充裕。那就應該是jdk版本問題,1.7及以前版本,永久帶空間不足,就會導致整個堆的一次Full GC出現,1.8及之后,改成了元空間(操作系統的內存空間),
  • 解決:增加永久帶的內存空間

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

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

相關文章

基于單片機的電子法頻率計

一、電子計數法測頻率原理 通過門控控制閘門開關,閘門時間T自己設定,計數器計數脈沖個數N(也就是待測信號),N個脈沖的時間間隔為δt,倒數即為信號的頻率f,由此 δtT/N fN/T——信號頻率 根據公式,如果考慮…

【C/C++】跟我一起學_C++同步機制效率對比與優化策略

文章目錄 C同步機制效率對比與優化策略1 效率對比2 核心同步機制詳解與適用場景3 性能優化建議4 場景對比表5 總結 C同步機制效率對比與優化策略 多線程編程中,同步機制的選擇直接影響程序性能與資源利用率。 主流同步方式: 互斥鎖原子操作讀寫鎖條件變量無鎖數據…

判斷兩臺設備是否在同一局域網內的具體方法

以下是判斷兩臺設備是否在同一局域網內的具體方法: 1. 檢查IP地址和子網掩碼 操作步驟: Windows系統: 按 Win R 鍵,輸入 cmd 并回車。輸入 ipconfig,查看 IPv4 地址 和 子網掩碼(如 192.168.1.5/255.255.2…

在R語言中如何將列的名字改成別的

在 R 中,更改數據框(data frame)中列的名字可以通過多種方法實現。以下是幾種常見的方法: 方法 1:使用 names() 函數 names() 函數可以獲取或設置數據框的列名。 示例 假設我們有一個數據框 data: dat…

JUC并發編程(上)

一、JUC學習準備 核心知識點:進程、線程、并發(共享模型、非共享模型)、并行 預備知識: 基于JDK8,對函數式編程、lambda有一定了解 采用了slf4j打印日志 采用了lombok簡化java bean編寫 二、進程與線程 進程和線程概念 兩者對比…

單地平面6層PCB設計實戰:如何兼顧電源與信號完整性?

摘要:面對復雜系統(SDRAM、WiFi、電機驅動等)且僅有1層地平面的6層板設計挑戰,本文從層疊規劃、電源噪聲抑制、高速信號處理等角度,總結可落地的設計技巧與避坑指南。 一、層疊設計:6層板如何“擠”出最優布…

spark:map 和 flatMap 的區別(Scala)

場景設定 假設有一個包含句子的 RDD: scala val rdd sc.parallelize(List("Hello World", "Hi Spark")) 目標是:將每個句子拆分成單詞。 1. 用 map 的效果 代碼示例 scala val resultMap rdd.map(sentence > sentence…

基于VSCode+PlatformIO環境的ESP8266的HX1838紅外模塊

以下是針對ESP8266開發板的紅外遙控解碼系統開發教程,基于VSCodePlatformIO環境編寫 一、概述 本實驗通過ESP8266開發板實現: 紅外遙控信號解碼自定義按鍵功能映射串口監控輸出基礎設備控制(LED) 硬件組成: NodeMC…

Kubernetes排錯(十四):Pod狀態異常排查手冊

當你在凌晨三點收到告警,發現Pod在崩潰循環中掙扎時,如何快速定位問題?本文將為你梳理一套生產環境通用的Pod排錯流程,并附上救火隊員必備的實用命令清單! 一、5分鐘快速定位:四步鎖定問題方向 步驟1&…

醫院藥品管理系統(準備工作)

準備工作 創建數據庫表 搭建Springboot框架 創建工程 定位maven 其他準備工作 創建數據庫表 建了九張表 搭建Springboot框架 創建工程 定位maven 把鏡像改為國內的 其他準備工作 安裝Lombok插件 額外添加依賴 如果添加依賴的過程中一直爆紅,可以刷新…

SpringBoot異步處理@Async深度解析:從基礎到高階實戰

一、異步編程基礎概念 1.1 同步 vs 異步 特性同步異步執行方式順序執行,阻塞調用非阻塞,調用后立即返回線程使用單線程完成所有任務多線程并行處理響應性較差,需等待前任務完成較好,可立即響應新請求復雜度簡單直觀較復雜&#…

簡單的強化學習舉例

1,定義獎勵函數 首先,需要根據具體的任務需求來定義獎勵函數。例如,對于機器人導航任務,可以根據機器人與目標點的距離來定義獎勵函數: import numpy as npdef navigation_reward(robot_position, target_position):…

css背景相關

背景書寫 background: url(src); // 注意:在寫動態樣式時,backgournd賦值格式錯誤,是不會在瀏覽器dom的style上顯示的 // 但是可以創建不可見的img,預加載來提高性能背景也會加載圖片資源 同img的src一樣,background也…

opencascade.js stp vite 調試筆記

Hello, World! | Op enCascade.js cnpm install opencascade.js cnpm install vite-plugin-wasm --save-dev 當你不知道文件寫哪的時候trae還是有點用的 ‘’‘ import { defineConfig } from vite; import wasm from vite-plugin-wasm; import rollupWasm from rollup/plug…

線程的一些事(2)

在java中,線程的終止,是一種“軟性”操作,必須要對應的線程配合,才能把終止落實下去 然而,系統原生的api其實還提供了,強制終止線程的操作,無論線程執行到哪,都能強行把這個線程干掉…

BGP實驗練習1

需求: 要求五臺路由器的環回地址均可以相互訪問 需求分析: 1.圖中存在五個路由器 AR1、AR2、AR3、AR4、AR5,分屬不同自治系統(AS),AR1 在 AS 100,AR2 - AR4 在 AS 200,AR5 在 AS …

滑動窗口——將x減到0的最小操作數

題目: 這個題如果我們直接去思考方法是很困難的,因為我們不知道下一步是在數組的左還是右操作才能使其最小。正難則反,思考一下,無論是怎么樣的,最終這個數組都會分成三個部分左中右,而左右的組合就是我們…

C++ RAII機制

RAII(Resource Acquisition Is Initialization)是一種編程范式,核心思想是:資源的生命周期與對象綁定——對象創建時獲取資源,對象銷毀時自動釋放資源。這種機制通過構造函數和析構函數的配對執行,確保資源…

連續抵消解碼器--Successive Cancellation decoder(SC 解碼器)

在這里,我們來看一下(Arikan,2009)中提供的連續取消解碼算法。 顧名思義,SC解碼算法從u0開始按順序解碼比特。 凍結的比特節點總是被解碼為0。 在解碼ui時,根據以下規則使用由向量表示的可用比特來解碼u…

suricata之規則去重

一、環境和背景 1.1 環境 OS: Ubuntu 22.04.5 LTS IDE: vscode suricata: suricata 7.0.5 1.2 背景 在添加規則時,為了給規則分類,將不同類別的規則寫入不同的文件。 在規則加載時兩條不同的規則卻被認為是重復的,因此記錄一下去重邏輯。…