自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

JVM調(diào)優(yōu)好用的內(nèi)存分析工具

開發(fā) 新聞
持續(xù)優(yōu)化和對(duì)比優(yōu)化前后的GC Log,能確認(rèn)吞吐量和性能是否得到提升。

對(duì)于高并發(fā)訪問量的電商、物聯(lián)網(wǎng)、金融、社交等系統(tǒng)來說,JVM內(nèi)存優(yōu)化是非常有必要的,可以提高系統(tǒng)的吞吐量和性能。通常調(diào)優(yōu)的首選方式是減少FGC次數(shù)或者FGC時(shí)間,以避免系統(tǒng)過多地暫停。FGC達(dá)到理想值后,比如一天或者兩天觸發(fā)一次FGC。FCT時(shí)間優(yōu)化為100~300毫秒后,再減少YoungGC次數(shù)或者YoungGC時(shí)間,YoungGC仍然會(huì)消耗CPU資源,優(yōu)化YoungGC調(diào)用次數(shù)和消耗的CPU資源,可以提高系統(tǒng)的吞吐量。

優(yōu)化GC前,必須獲取GC的實(shí)際使用情況,最好的方式是通過CG Log收集垃圾回收日志,通過一些可視化工具查看垃圾回收分析數(shù)據(jù),比如GCEasy。持續(xù)優(yōu)化和對(duì)比優(yōu)化前后的GC Log,能確認(rèn)吞吐量和性能是否得到提升。

下面推薦幾個(gè)常用的內(nèi)存分析命令和工具

jstat命令

JDK自帶的jstat命令用于查看虛擬機(jī)垃圾回收的情況,如下命令使用gcutil參數(shù)輸出堆內(nèi)存使用情況統(tǒng)計(jì):

jstat –gcutil  -h 20 pid 1000 100

此命令顯示進(jìn)程為pid的內(nèi)存使用匯總,1000毫秒輸出一次,總共輸出100行。-h 20表示每20行輸出一次表頭。-gcutil表示顯示JVM內(nèi)存使用匯總統(tǒng)計(jì):

圖片

列表顯示了虛擬機(jī)各個(gè)代的使用情況,描述了堆內(nèi)存的使用占比和垃圾回收次數(shù),以及占用時(shí)間,具體含義如下: 

  • S0,第一個(gè)幸存區(qū)使用比值。
  • S1,第二個(gè)幸存區(qū)的使用率。
  • E,伊甸園區(qū)的使用比值。
  • O,老年代。
  • M,方法區(qū)、元空間使用率。
  • CCS,壓縮使用比值。
  • YGC,年輕代垃圾回收次數(shù)。
  • YGCT,年輕帶垃圾回收占用時(shí)間。
  • FGC,全局垃圾回收次數(shù),這對(duì)性能影響至關(guān)重要。
  • FGCT,全局垃圾回收的消耗時(shí)間。
  • GCT,總的垃圾回收時(shí)間。

可以看到S0、S1、E變化頻率高,說明程序在頻繁創(chuàng)建生命周期短的對(duì)象,F(xiàn)GC為0,表示還未做過全局垃圾回收。如果FGC變化頻率很高,則說明系統(tǒng)性能和吞吐量將下降,或者可能出現(xiàn)內(nèi)存溢出。

其他查看匯總信息的常用選項(xiàng)如下:

  • -gc,類似gcutil,gcutil以百分比形式顯示內(nèi)存的使用情況,gc顯示的是內(nèi)存占用的字節(jié)數(shù),以KB的形式輸出堆內(nèi)存的使用情況。
  • -gccause,類似gcutil,額外輸出GC的原因。

jmap命令

jmap命令用于保存虛擬機(jī)內(nèi)存鏡像到文件中,然后可以使用JVisualVM或者M(jìn)AT工具進(jìn)行進(jìn)一步分析。命令如下:?

jmap -dump:format=b,file=filename.hprof pid

需要注意,實(shí)際系統(tǒng)會(huì)有2GB到8GB內(nèi)存,此命令會(huì)導(dǎo)致虛擬機(jī)暫停工作1~3秒。還有一種是被動(dòng)獲取方式,當(dāng)虛擬機(jī)出現(xiàn)內(nèi)存溢出的時(shí)候,會(huì)主動(dòng)“dump”內(nèi)存文件。添加虛擬機(jī)啟動(dòng)參數(shù):?

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof

當(dāng)虛擬機(jī)判斷達(dá)到內(nèi)存溢出觸發(fā)條件的時(shí)候,會(huì)有如下輸出并保存鏡像文件:?

java.lang.OutOfMemoryError: Java heap space
Dumping heap to heapdump.hprof ...

當(dāng)獲得鏡像文件后,打開JvisualVM工具,選擇菜單“File”,點(diǎn)擊裝入,選擇我們保存過的dump文件,這時(shí)面板會(huì)打開內(nèi)存鏡像文件。打開較大的內(nèi)存鏡像文件需要較長的時(shí)間,需要耐心等候,其他工具,如MAT,或者商業(yè)的YourKit Java Profiler打開鏡像文件更快,分析功能更強(qiáng)大。

GCeasy

GCeasy是一個(gè)分析GC日志文件的在線網(wǎng)站,能根據(jù)上傳的GC日志,以圖表形式顯示GC回收過程和統(tǒng)計(jì)數(shù)據(jù)。下圖顯示的是GC性能的統(tǒng)計(jì)情況,如吞吐量顯示為99.935%,說明只有少量CPU資源用于垃圾回收。最長的GC時(shí)間是20毫秒,屬于正常范圍。在測試JVM參數(shù)調(diào)整是否能增加吞吐量,減小垃圾回收占用的CPU時(shí),可以使用這個(gè)統(tǒng)計(jì)功能。

圖片

下圖統(tǒng)計(jì)了GC總的時(shí)間和回收的字節(jié)數(shù),也顯示了Full GC的統(tǒng)計(jì)情況。

圖片

JMC

Java Mission Control簡稱JMC,是JDK自帶的工具,是一個(gè)高性能的對(duì)象監(jiān)視、管理、產(chǎn)生時(shí)間分析和診斷的工具套件,筆者主要用來追蹤熱點(diǎn)代碼與熱點(diǎn)線程,是主要的內(nèi)存優(yōu)化調(diào)優(yōu)工具。

類似JVisualVM,通過JMX連接進(jìn)入JMC控制臺(tái)。

通過連接到遠(yuǎn)程JVM進(jìn)程后,可以執(zhí)行飛行記錄(FlightRecord),選擇飛行記錄存放的路徑與執(zhí)行時(shí)間即可,如下圖所示。需要注意的是,執(zhí)行飛行記錄功能時(shí)會(huì)對(duì)當(dāng)前JVM進(jìn)程有一定的性能影響(大約為5%~10%),所以建議JMC連接隔離環(huán)境中的服務(wù)器并執(zhí)行飛行記錄功能。

通過一段時(shí)間的記錄,飛行記錄可以反映線程的繁忙程度,以及CPU的熱點(diǎn)方法。

使用熱點(diǎn)方法可以直接找到最耗時(shí)的幾個(gè)方法,對(duì)熱點(diǎn)方法重點(diǎn)優(yōu)化就可以使CPU的使用率下降一大截。

飛行記錄還可以反映內(nèi)存增長的熱點(diǎn)方法,以及顯示單位時(shí)間內(nèi)創(chuàng)建的最多對(duì)象的方法。下圖為找到的內(nèi)存對(duì)象中創(chuàng)建的最多的char[]的方法,一個(gè)是Fastjson,另一個(gè)是Kryo。

小結(jié):通過JMC的熱點(diǎn)方法的統(tǒng)計(jì)結(jié)果可以有針對(duì)性地進(jìn)行優(yōu)化,筆者通過對(duì)線上系統(tǒng)進(jìn)行優(yōu)化使得CPU使用率下降了40%、內(nèi)存GC頻率下降了100%以上。

MAT

MAT是Memory Analyzer的簡稱,它是一款功能強(qiáng)大的Java堆內(nèi)存分析器,可以分析具有數(shù)億個(gè)對(duì)象的內(nèi)存鏡像,快速計(jì)算對(duì)象大小,自動(dòng)找到嫌疑的泄漏對(duì)象并形成內(nèi)存泄漏報(bào)告。MAT是基于Eclipse開發(fā)的,是一款免費(fèi)的內(nèi)存鏡像分析工具,是筆者發(fā)現(xiàn)內(nèi)存泄漏原因的主要工具。

通過File-Open Heap Dump可以打開內(nèi)存鏡像文件,顯示內(nèi)容如下圖所示。

圖片

它提供了Leak Suspects 報(bào)告,輸出有可能發(fā)生內(nèi)存泄漏的對(duì)象。

OQL

OQL語句類似SQL語句,可以在VisualVM、MAT等大多數(shù)內(nèi)存鏡像分析工具中執(zhí)行,完成對(duì)象查找任務(wù)。

對(duì)于程序員和架構(gòu)師來說,Java系統(tǒng)的性能優(yōu)化是一個(gè)超常規(guī)的挑戰(zhàn)。

這是因?yàn)镴ava語言和Java運(yùn)行平臺(tái),以及Java生態(tài)的復(fù)雜性決定了Java系統(tǒng)的性能優(yōu)化不再是簡單的升級(jí)配置或者簡單的 "空間換時(shí)間”的技術(shù)實(shí)現(xiàn),這涉及Java的各種知識(shí)點(diǎn),如編寫高性能Java代碼,Java代碼的編譯優(yōu)化,運(yùn)行時(shí)刻的JIT優(yōu)化,JVM的內(nèi)存管理優(yōu)化等,還包括如何使用高性能的第三方開源工具,以及微服務(wù)和分布式系統(tǒng)設(shè)計(jì)需要關(guān)注的性能事項(xiàng)。

責(zé)任編輯:張燕妮 來源: 華仔聊技術(shù)
相關(guān)推薦

2010-09-25 15:52:27

JVM內(nèi)存JVM

2010-09-26 10:53:00

JVM內(nèi)存調(diào)優(yōu)設(shè)置

2017-10-17 14:02:30

jvm調(diào)優(yōu)工具

2012-01-10 14:35:08

JavaJVM

2023-05-29 07:43:32

JVM內(nèi)存調(diào)優(yōu)

2017-07-21 08:55:13

TomcatJVM容器

2023-11-11 19:07:23

JVMJava

2019-11-01 08:49:07

JVM監(jiān)控性能

2009-07-09 09:47:26

Sun JVM

2020-12-30 15:06:39

開發(fā)技能代碼

2010-09-27 09:23:42

JVM調(diào)優(yōu)

2020-08-10 17:49:25

JVM內(nèi)存溢出

2023-11-10 11:23:20

JVM內(nèi)存

2021-03-17 11:35:11

JVM代碼Java

2010-09-26 09:08:17

JVM調(diào)優(yōu)

2010-09-26 13:39:46

JVM調(diào)優(yōu)

2012-01-10 15:13:56

JavaJVM

2010-09-17 14:17:05

JVM內(nèi)存設(shè)置

2019-12-20 14:21:26

JVM調(diào)優(yōu)垃圾回收

2021-06-03 08:32:18

JVM調(diào)優(yōu)虛擬機(jī)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)