jvm相關參數及java內存/性能調優常用工具、方法、命令


一、jvm相關參數

1、通過 jstat -gc pid interval 查看每次 GC 之后,具體每一個分區的內存使用率變化情況

2、通過jcmd pid VM.flags 就可以查看到jvm相關的設置參數

3、通過“jmap -heap 進程id”查詢出 當前進程的JVM 的配置信息,其中就包括垃圾收集器的設置類型

4、查看 & 分析 GC 日志

首先,我們需要通過 JVM 參數預先設置 GC 日志,通常有以下幾種 JVM 參數設置:

-XX:+PrintGC 輸出 GC 日志
-XX:+PrintGCDetails 輸出 GC 的詳細日志
-XX:+PrintGCTimeStamps 輸出 GC 的時間戳(以基准時間的形式)
-XX:+PrintGCDateStamps 輸出 GC 的時間戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在進行 GC 的前后打印出堆的信息
-Xloggc:../logs/gc.log 日志文件的輸出路徑

 eg:-XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/log/heapTest.log

如果GC日志非常大,可以用GCViewer工具打開日志文件,圖形化界面查看整體的 GC 性能,如下圖所示:

也可以用GCeasy工具,並且還可以將日志文件壓縮之后,上傳到 GCeasy 官網即可看到非常清楚的 GC 日志分析結果

5、堆中年輕代和老年代的比例設置

在 JDK中,默認情況下年輕代和老年代的比例是 1:2,我們可以通過–XX:NewRatio 重置該配置項。

6、堆中年輕代的 Eden 和 To Survivor、From Survivor 的比例是設置

在 JDK中,默認情況堆中年輕代的 Eden 和 To Survivor、From Survivor 的比例是8:1:1,我們可以通過 -XX:SurvivorRatio 重置該配置項。

eg:-XX:SurvivorRatio=8 將 Eden、Survivor 的比例設置為 8:2

7、 -XX:+UseAdaptiveSizePolicy 配置項,JVM 將會動態調整 Java 堆中各個區域的大小以及進入老年代的年齡

ps1、通過 -XX:-UseAdaptiveSizePolicy 關閉該項配置

ps2、如果開啟了 -XX:+UseAdaptiveSizePolicy 配置項,–XX:NewRatio 和 -XX:SurvivorRatio 將會失效,而 JDK1.8 是默認開啟 -XX:+UseAdaptiveSizePolicy 的

ps3、在 JDK1.8 中,不要隨便關閉 UseAdaptiveSizePolicy 配置項,除非你已經對初始化堆內存 / 最大堆內存、年輕代 / 老年代以及 Eden 區 /Survivor 區有非常明確的規划了。否則 JVM 將會分配最小堆內存,年輕代和老年代按照默認比例 1:2 進行分配,年輕代中的 Eden 和 Survivor 則按照默認比例 8:2 進行分配。這個內存分配未必是應用服務的最佳配置,因此可能會給應用服務帶來嚴重的性能問題。

8、調整某一個程序的堆內存空間

java -jar -Xms4g -Xmx4g heapTest-0.0.1-SNAPSHOT.jar

9、-XX:PetenureSizeThreshold

如果分配的對象內存超過了設置的閥值,會直接分配到老年代,這樣做的好處就是可以減少新生代的垃圾回收。

 

二、java內存/性能調優常用工具、方法、命令

 1、linux之top命令

實時顯示正在執行進程的 CPU 使用率、內存使用率以及系統負載等信息

2、linux之top Hp pid命令

查看具體線程使用系統資源情況

3、Linux 之 vmstat 命令

vmstat 是一款指定采樣周期和次數的功能性監測工具,我們可以看到,它不僅可以統計內存的使用情況,還可以觀測到 CPU 的使用率、swap 的使用情況。但 vmstat 一般很少用來查看內存的使用情況,而是經常被用來觀察進程的上下文切換。

 

 

r:等待運行的進程數;   b:處於非中斷睡眠狀態的進程數;     swpd:虛擬內存使用情況;   free:空閑的內存;buff:用來作為緩沖的內存數;si:從磁盤交換到內存的交換頁數量;so:從內存交換到磁盤的交換頁數量;bi:發送到塊設備的塊數;bo:從塊設備接收到的塊數;in:每秒中斷數;cs:每秒上下文切換次數;us:用戶 CPU 使用時間;sy:內核 CPU 系統使用時間;id:空閑時間;wa:等待 I/O 時間;st:運行虛擬機竊取的時間。

 4、linux之pidstat命令

pidstat是 Sysstat 中的一個組件;可以通過yum install sysstat 安裝該監控組件。pidstat 命令則是深入到線程級別的監測工具。

pidstat的常用參數:

-u:默認的參數,顯示各個進程的 cpu 使用情況;-r:顯示各個進程的內存使用情況;-d:顯示各個進程的 I/O 使用情況;-w:顯示每個進程的上下文切換情況;-p:指定進程號;-t:持續顯示進程中線程的檢測信息。

如:

 

 -r 表示監控內存的使用情況,1 表示每秒的意思,3 則表示采樣次數

Minflt/s:任務每秒發生的次要錯誤,不需要從磁盤中加載頁;Majflt/s:任務每秒發生的主要錯誤,需要從磁盤中加載頁;VSZ:虛擬地址大小,虛擬內存使用 KB;RSS:常駐集合大小,非交換區內存使用 KB。

5、JDK 工具之 jstat 命令

jstat 可以監測 Java 應用程序的實時運行情況,包括堆內存信息以及垃圾回收信息

jstat的常用參數:

-class:顯示 ClassLoad 的相關信息;-compiler:顯示 JIT 編譯的相關信息;-gc:顯示和 gc 相關的堆信息;-gccapacity:顯示各個代的容量以及使用情況;-gcmetacapacity:顯示 Metaspace 的大小;-gcnew:顯示新生代信息;-gcnewcapacity:顯示新生代大小和使用情況;-gcold:顯示老年代和永久代的信息;-gcoldcapacity :顯示老年代的大小;-gcutil:顯示垃圾收集信息;-gccause:顯示垃圾回收的相關信息(通 -gcutil),同時顯示最后一次或當前正在發生的垃圾回收的誘因;-printcompilation:輸出 JIT 編譯的方法信息。

如:

 

S0C:年輕代中 To Survivor 的容量(單位 KB);S1C:年輕代中 From Survivor 的容量(單位 KB);S0U:年輕代中 To Survivor 目前已使用空間(單位 KB);S1U:年輕代中 From Survivor 目前已使用空間(單位 KB);EC:年輕代中 Eden 的容量(單位 KB);EU:年輕代中 Eden 目前已使用空間(單位 KB);OC:Old 代的容量(單位 KB);OU:Old 代目前已使用空間(單位 KB);MC:Metaspace 的容量(單位 KB);MU:Metaspace 目前已使用空間(單位 KB);YGC:從應用程序啟動到采樣時年輕代中 gc 次數;YGCT:從應用程序啟動到采樣時年輕代中 gc 所用時間 (s);FGC:從應用程序啟動到采樣時 old 代(全 gc)gc 次數;FGCT:從應用程序啟動到采樣時 old 代(全 gc)gc 所用時間 (s);GCT:從應用程序啟動到采樣時 gc 用的總時間 (s)。

6、JDK 工具之 jstack 命令

一種線程堆棧分析工具,最常用的功能就是使用 jstack pid 命令查看線程的堆棧信息,通常會結合 top -Hp pid 或 pidstat -p pid -t 一起查看具體線程的狀態,也經常用來排查一些死鎖的異常

7、JDK 工具之 jmap 命令

jmap 除了可以查看堆內存初始化配置信息以及堆內存的使用情況。還可以使用 jmap 輸出堆內存中的對象信息,包括產生了哪些對象,對象數量多少等。

如:

7.1、可以用 jmap 來查看堆內存初始化配置信息以及堆內存的使用情況

 

 7.2、使用 jmap -histo[:live] pid 查看堆內存中的對象數目、大小統計直方圖,如果帶上 live 則只統計活對象:

 

 7.3、可以通過 jmap 命令把堆內存的使用情況 dump 到文件中

 

ps1、一般使用方式如下:

java -jar -Xms1000m -Xmx4000m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/tmp/heapTest.log heapTest-0.0.1-SNAPSHOT.jar

ps2、可以使用 MAT 工具打開文件進行分析 

 

看到具體哪個對象引用了這個Byte數組對象

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM