1. 程式人生 > >【JVM】效能調優

【JVM】效能調優

問題 & 目標

JVM問題:CPU load過高、請求延遲、TPS降低、記憶體洩漏

調優目標:使用較小的記憶體佔用獲得較高的吞吐量 或者 較低的延遲

調優指標:

  • 記憶體佔用:程式正常執行需要的記憶體大小
  • 延遲:由於垃圾收集而引起的程式停頓時間
  • 吞吐量:使用者程式執行時間佔用使用者程式和垃圾收集佔用總時間比值

參考日誌

這裡寫圖片描述

這裡寫圖片描述

  1. 系統執行日誌:程式程式碼列印的日誌,描述了程式碼級別的系統執行軌跡
  2. 堆疊錯誤資訊:根據堆疊資訊可以初步定位問題所在
  3. GC日誌:程式啟動時用-XX:+PrintGCDetails-xloggc:/data/jvm/gc.log把程式執行時GC過程記錄下來,通過GC日誌分析每塊記憶體區域的GC的頻率、時間,從而發現問題所在
  4. 執行緒快照:通過jstack pid,可以dump出當前程序中執行緒的快照資訊,通過觀察執行緒在某一時刻的狀態,如果系統中存在請求超時、死迴圈、死鎖情況時,可以根據快照進一步確定問題。
  5. 堆轉儲快照:程式啟動時使用-XX:+HeapDumpOnOutOfMemory-XX:HeapDumpPath=/data/jvm/dumpfile.hprof命令,當程式發生記憶體溢位時,把當時的記憶體快照以檔案形式轉儲,事後對當時的記憶體使用情況分析

JVM調優工具

  1. jps命令:檢視JVM啟動的所有程序、執行主類的全名、JVM啟動引數

  2. jstat命令:監視虛擬機器資訊,例jstat -gc pid 500 10

    (每500ms列印各個區容量、使用容量、gc時間,列印10次)

  3. jmap命令:檢視堆記憶體資訊,例jmap -histo pid(列印當前堆中每個類的例項數量和記憶體佔用)

  4. jhat命令:通過瀏覽器分析對應的記憶體快照,例jhat -port 9810 -J-Xmx4G /data/jvm/dumpfile_jmap.hprof(以9810埠啟動jhat內嵌的伺服器)

  5. jconsole / jvisualvm:分析記憶體資訊(各個區記憶體變化情況)

JVM調優經驗

說明:

  • 一般情況採用預設配置,在測試中根據系統執行狀況和GC日誌、記憶體監控進行合理調整
  • 新生代越大,老年代越小,Full GC 頻率越高,但 Full GC 時間短
  • 新生代越小,老年代越大,Full GC 頻率越低,但 Full GC 時間長

引數設定:

  1. -Xms-Xmx的值設成相等,Heap不夠用時,會發生記憶體抖動,影響程式執行穩定性
    堆大小預設為-Xms指定大小;
    預設空閒堆記憶體小於40%時,JVM會擴大堆到-Xmx指定的大小;
    空閒堆記憶體大於70%時,JVM會減小堆到Xms指定大小;
    如果在 Full GC 後滿足不了記憶體需求會動態調整,這個階段比較耗費資源

  2. 新生代儘量設定大一些,讓物件在新生代多存活一段時間,每次 Minor GC 都要儘可能多的收集垃圾物件,防止或延遲物件進入老年代的機會,從而減少 Full GC 的頻率

  3. 老年代如果使用CMS收集器,新生代可以不用太大(CMS並行收集速度很快,可以和使用者執行緒併發執行)

  4. 方法區大小設定,1.6之前需要考慮系統執行時動態增加的常量、靜態變數,1.7只要能裝下類資訊就可以

程式碼實現:

  1. 避免建立過大的物件及陣列:過大物件在新生代沒有足夠空間會直接進入老年代,如果是短命大物件,會提前觸發 Full GC
  2. 避免同時載入大量資料:可以分批讀取,用完後儘快清空引用
  3. 用完儘快清空集合中物件的引用: 儘快回收,避免進入老年代
  4. 在合適場景採用軟引用、弱引用:記憶體溢位前會把它們列入回收範圍進行二次回收
  5. 避免產生死迴圈:死迴圈產生後,可能產生大量例項,導致空間佔滿

JVM引數

引數 說明 例項
-Xms 初始堆大小,預設實體記憶體的 1/64 -Xms512M
-Xmx 最大堆大小,預設實體記憶體的 1/4 -Xmx2G
-Xmn 新生代記憶體大小,官方推薦為整個堆的 3/8 -Xmn512M
-Xss 執行緒堆疊大小,jdk1.5及之後預設1M,之前預設 256k -Xss512k
-XX:NewRatio=n 設定新生代和年老代的比值。例:3,表示年輕代與年老代比值為1:3 -XX:NewRatio=3
-XX:SurvivorRatio=n 年輕代中Eden區與兩個Survivor區的比值。例:8,表示Eden:Survivor=8:1:1 -XX:SurvivorRatio=8
-XX:PermSize=n 永久代初始值,預設為實體記憶體的 1/64 -XX:PermSize=128M
-XX:MaxPermSize=n 永久代最大值,預設為實體記憶體的 1/4 -XX:MaxPermSize=256M
-verbose:class 在控制檯列印類載入資訊
-verbose:gc 在控制檯列印垃圾回收日誌
-XX:+PrintGC 列印GC日誌,內容簡單
-XX:+PrintGCDetails 列印GC日誌,內容詳細
-XX:+PrintGCDateStamps 在GC日誌中新增時間戳
-Xloggc:filename 指定gc日誌路徑 -Xloggc:/data/jvm/gc.log
-XX:+UseSerialGC 年輕代設定序列收集器Serial
-XX:+UseParallelGC 年輕代設定並行收集器Parallel Scavenge
-XX:ParallelGCThreads=n 設定Parallel Scavenge收集時使用的CPU數。並行收集執行緒數 -XX:ParallelGCThreads=4
-XX:MaxGCPauseMillis=n 設定Parallel Scavenge回收的最大時間(毫秒) -XX:MaxGCPauseMillis=100
-XX:GCTimeRatio=n 設定Parallel Scavenge垃圾回收時間佔程式執行時間的百分比。公式為1/(1+n) -XX:GCTimeRatio=19
-XX:+UseParallelOldGC 設定老年代為並行收集器ParallelOld收集器
-XX:+UseConcMarkSweepGC 設定老年代併發收集器CMS
-XX:+CMSIncrementalMode 設定CMS收集器為增量模式,適用於單CPU情況

相關推薦

JVM效能調

問題 & 目標 JVM問題:CPU load過高、請求延遲、TPS降低、記憶體洩漏 調優目標:使用較小的記憶體佔用獲得較高的吞吐量 或者 較低的延遲 調優指標: 記憶體佔用:程

MySQL-效能調

mysql這塊我們是用的druid監控,在監控頁面上可以看到查詢次數和查詢時間 1.查詢次數太多的就放到快取裡,我們曾經遇到過一條特別不起眼的SQL查詢特別慢,後來發現他的呼叫特別頻繁,因為好幾個服務

Scrapy爬蟲系列2效能調

加快爬蟲速度: 在 settings.py 裡把 TIMEOUT 設小點提高併發數( CONCURRENT_REQUESTS )瓶頸在 IO ,所以很有可能 IO 跑滿,但是 CPU 沒跑

Jvm效能調監控工具jps、jstack、jmap、jhat、jstat、hprof

現實企業級Java開發中,有時候我們會碰到下面這些問題: OutOfMemoryError,記憶體不足 記憶體洩露 執行緒死鎖 鎖爭用(Lock Contention) Java程序消耗CPU過高 ......     這些問題在日常開發中可能被很多人忽視

mysql知識盤點_調引數

本文內容整理自《Mysql運維內參》第26章,本書值得一看,即使是開發同學。連結如下: genera_log 建議在資料庫正常服務時,將這個引數設定為關閉狀態,因為它會記

Tomcat(JVM效能調

Tomcat架構圖      Tomcat與JVM版本優化 Tomcat的執行是基於Java的虛擬機器。SUN的JVM動態庫有client和server兩個版本,分別針對桌面應用和伺服器應用做了相應的優化,client版本載入速度較快,server版本載入速度較慢但

Tomcat 和 JVM效能調總結

Tomcat效能調優:        找到Tomcat根目錄下的conf目錄,修改server.xml檔案的內容。對於這部分的調優,我所瞭解到的就是無非設定一下Tomcat伺服器的最大併發數和Tom

5.JVM三大效能調引數:-Xms -Xmx -Xss

1.-Xss是對每個執行緒stack大小的調整。直接影響對方法的呼叫次數 測試結果: 測試程式碼: package com.dt.spark.jvm.basics; public class HelloStackOverFlow {private static int c

第5課:實戰演示JVM三大效能調引數:-Xms -Xmx -Xss

第3課: 1、應用程式是多執行緒的,多執行緒共享全域性共享記憶體空間,每個執行緒也有自己的記憶體空間, 執行緒與全域性共享記憶體空間怎麼互動呢? 執行緒如果要使用全域性共享變數,就將全域性共享變數拷貝過去,拷貝到執行緒的記憶體空間,交給執行緒的程式碼去處理,而不是直接去操

WebLogicweblogic調

文章 weblogic 設置 statistic 串行 ear add height lin 版權聲明:本文為博主原創文

JVM解讀-效能調例項

JVM效能調優 1 堆設定調優 年輕代大小選擇 響應時間優先的應用:儘可能設大,直到接近系統的最低響應時間限制(

《Tomcat和JVM效能調你真的學會了嗎?》總結篇

  Tomcat效能調優: 找到Tomcat根目錄下的conf目錄,修改server.xml檔案的內容。對於這部分的調優,我所瞭解到的就是無非設定一下Tomcat伺服器的最大併發數和Tomcat初始化時建立的執行緒數的設定,當然還有其他一些效能調優的設定,下圖是我根據我機子的效能設定的一些引數

JAVA進階架構師指南之五:JVM效能調

## 前言   首先給大家說聲對不起,最近屬實太忙了,白天上班,晚上加班,回家還要收拾家裡,基本每天做完所有事兒都是凌晨一兩點了,沒有精力再搞其他的了.   好了,進入正題,讓我們來聊聊JVM篇最後一個章節----JVM效能調優.童鞋們隨便開啟一個大廠的招聘崗位JD,應該都會有JVM調優相關的描述,其實招

Big Data 每日一題Spark開發效能調總結

1. 分配資源調優 Spark效能調優的王道就是分配資源,即增加和分配更多的資源對效能速度的提升是顯而易見的,基本上,在一定範圍之內,增加資源與效能的提升是成正比的,當公司資源有限,能分配的資源達到頂峰之後,那麼才去考慮做其他的調優 如何分配及分配哪些資源 在生產環境中,提交spark作

不吹不黑這應該是目前最系統的 Android 介面效能調資料了

一. Android渲染知識 1.1 繪製原理 Android系統要求每一幀都要在 16ms 內繪製完成,平滑的完成一幀意味著任何特殊的幀需要執行所有的渲染程式碼(包括 framework 傳送給 GPU 和 CPU 繪製到緩衝區的命令)都要在 16ms 內完成,保持流暢的體驗。這個速度

jvm-從原理到實踐深入剖析jvm調(小白也適用)

1.why? 為什麼要進行Jvm調優?因為jdk預設的jvm引數並不能很好的滿足每個專案的實際效能需求,因為不同的專案本身佔用記憶體cpu資源就不一樣,加上伺服器配置的多種多樣,jvm提供的初始引數很難達到定製的效果,在專案生產環境中,除了對程式碼,sql,web容器等優化

效能調的最佳實踐jQuery基本原理

1、迴圈中快取length var myLength = myArray.length; for (var i = 0; i < myLength; i++) { // do stuff } 2、在迴圈外使用append,避免過於頻繁操作DOM // 別

JVMJVM調之jstack找出最耗cpu的執行緒並定位程式碼

jstack可以定位到執行緒堆疊,根據堆疊資訊我們可以定位到具體程式碼,所以它在JVM效能調優中使用得非常多。下面我們來一個例項找出某個Java程序中最耗費CPU的Java執行緒並定位堆疊資訊,用到的命令有ps、top、printf、jstack、grep。 第一步先找

Zabbix效能調:配置優化

轉載:https://sre.ink/zabbix-turn-conf/ #通過日誌可以分析當前服務狀態。LogFile=/tmp/zabbix_server.log #日誌檔案路徑。LogFileSize=1 #日誌檔案最大值(MB),超過則滾動,設為0表示不回滾。DebugLevel=3 #除錯日誌級別

效能調Oracle AWR報告指標全解析

Hawk Eyes 看AWR的鷹眼= 基礎理論夯實+看過500份以上AWR 啥是AWR? =====================================================================================