【JVM】效能調優
問題 & 目標
JVM問題:CPU load過高、請求延遲、TPS降低、記憶體洩漏
調優目標:使用較小的記憶體佔用獲得較高的吞吐量 或者 較低的延遲
調優指標:
- 記憶體佔用:程式正常執行需要的記憶體大小
- 延遲:由於垃圾收集而引起的程式停頓時間
- 吞吐量:使用者程式執行時間佔用使用者程式和垃圾收集佔用總時間比值
參考日誌
- 系統執行日誌:程式程式碼列印的日誌,描述了程式碼級別的系統執行軌跡
- 堆疊錯誤資訊:根據堆疊資訊可以初步定位問題所在
- GC日誌:程式啟動時用
-XX:+PrintGCDetails
和-xloggc:/data/jvm/gc.log
把程式執行時GC過程記錄下來,通過GC日誌分析每塊記憶體區域的GC的頻率、時間,從而發現問題所在 - 執行緒快照:通過
jstack pid
,可以dump出當前程序中執行緒的快照資訊,通過觀察執行緒在某一時刻的狀態,如果系統中存在請求超時、死迴圈、死鎖情況時,可以根據快照進一步確定問題。 - 堆轉儲快照:程式啟動時使用
-XX:+HeapDumpOnOutOfMemory
和-XX:HeapDumpPath=/data/jvm/dumpfile.hprof
命令,當程式發生記憶體溢位時,把當時的記憶體快照以檔案形式轉儲,事後對當時的記憶體使用情況分析
JVM調優工具
jps
命令:檢視JVM啟動的所有程序、執行主類的全名、JVM啟動引數jstat
命令:監視虛擬機器資訊,例jstat -gc pid 500 10
jmap
命令:檢視堆記憶體資訊,例jmap -histo pid
(列印當前堆中每個類的例項數量和記憶體佔用)jhat
命令:通過瀏覽器分析對應的記憶體快照,例jhat -port 9810 -J-Xmx4G /data/jvm/dumpfile_jmap.hprof
(以9810埠啟動jhat內嵌的伺服器)jconsole / jvisualvm:分析記憶體資訊(各個區記憶體變化情況)
JVM調優經驗
說明:
- 一般情況採用預設配置,在測試中根據系統執行狀況和GC日誌、記憶體監控進行合理調整
- 新生代越大,老年代越小,Full GC 頻率越高,但 Full GC 時間短
- 新生代越小,老年代越大,Full GC 頻率越低,但 Full GC 時間長
引數設定:
-Xms
和-Xmx
的值設成相等,Heap不夠用時,會發生記憶體抖動,影響程式執行穩定性
堆大小預設為-Xms
指定大小;
預設空閒堆記憶體小於40%時,JVM會擴大堆到-Xmx
指定的大小;
空閒堆記憶體大於70%時,JVM會減小堆到Xms
指定大小;
如果在 Full GC 後滿足不了記憶體需求會動態調整,這個階段比較耗費資源新生代儘量設定大一些,讓物件在新生代多存活一段時間,每次 Minor GC 都要儘可能多的收集垃圾物件,防止或延遲物件進入老年代的機會,從而減少 Full GC 的頻率
老年代如果使用CMS收集器,新生代可以不用太大(CMS並行收集速度很快,可以和使用者執行緒併發執行)
方法區大小設定,1.6之前需要考慮系統執行時動態增加的常量、靜態變數,1.7只要能裝下類資訊就可以
程式碼實現:
- 避免建立過大的物件及陣列:過大物件在新生代沒有足夠空間會直接進入老年代,如果是短命大物件,會提前觸發 Full GC
- 避免同時載入大量資料:可以分批讀取,用完後儘快清空引用
- 用完儘快清空集合中物件的引用: 儘快回收,避免進入老年代
- 在合適場景採用軟引用、弱引用:記憶體溢位前會把它們列入回收範圍進行二次回收
- 避免產生死迴圈:死迴圈產生後,可能產生大量例項,導致空間佔滿
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、應用程式是多執行緒的,多執行緒共享全域性共享記憶體空間,每個執行緒也有自己的記憶體空間, 執行緒與全域性共享記憶體空間怎麼互動呢? 執行緒如果要使用全域性共享變數,就將全域性共享變數拷貝過去,拷貝到執行緒的記憶體空間,交給執行緒的程式碼去處理,而不是直接去操
【WebLogic】weblogic調優
文章 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 // 別
【轉】【JVM】JVM調優之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? =====================================================================================