JVM调优技巧与经验
吞吐量:用戶代碼時(shí)間/(用戶代碼時(shí)間 + 垃圾回收時(shí)間)
響應(yīng)時(shí)間:STW越短,響應(yīng)時(shí)間越好
調(diào)優(yōu)追求的是什么?吞吐量優(yōu)先還是響應(yīng)時(shí)間優(yōu)先,還是在滿足一定響應(yīng)時(shí)間的情況下,達(dá)到多大的吞吐量。
科學(xué)計(jì)算,吞吐量
什么是調(diào)優(yōu)?
- 根據(jù)需求進(jìn)行JVM規(guī)劃和預(yù)調(diào)優(yōu)
- 優(yōu)化JVM運(yùn)行環(huán)境(慢、卡頓)
- 解決JVM運(yùn)行過程中的各種問題,如OOM
JVM調(diào)優(yōu)其實(shí)就是盡量減少Full GC次數(shù)和時(shí)間。
Full GC會(huì)導(dǎo)致STW(stop the world),Java所有線程掛起,,用戶就會(huì)有卡頓的感覺。
minor GC也會(huì)導(dǎo)致STW,但是時(shí)間很短對程序運(yùn)行影響較小。而Full GC時(shí)間較長,一般比minor GC
慢10倍以上,應(yīng)該盡量避免。
一般生產(chǎn)環(huán)境中,幾天才會(huì)觸發(fā)一次FGC,甚至一周。
在jvm參數(shù)中配置,可以打印GC日志
-XX:+PrintGCDetails
-Xloggc:/{path}/gc.log
參數(shù)總結(jié):
-XX:+PrintGC 輸出GC日志
-XX:+PrintGCDetails 輸出GC的詳細(xì)日志
-XX:+PrintGCTimeStamps 輸出GC的時(shí)間戳(以基準(zhǔn)時(shí)間的形式)
-XX:+PrintGCDateStamps 輸出GC的時(shí)間戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在進(jìn)行GC的前后打印出堆的信息
-Xloggc:…/logs/gc.log 日志文件的輸出路徑
[Times: user=0.00 sys=0.00, real=0.00 secs]分別表示
用戶消耗的CPU時(shí)間 內(nèi)核態(tài)消耗的CPU時(shí)間 操作從開始到結(jié)束所經(jīng)過的墻鐘時(shí)間(Wall Clock Time)
user是用戶態(tài)耗費(fèi)的時(shí)間,sys是內(nèi)核態(tài)耗費(fèi)的時(shí)間,real是整個(gè)過程實(shí)際花費(fèi)的時(shí)間。user+sys是CPU時(shí)間,每個(gè)CPU core單獨(dú)計(jì)算,所以這個(gè)時(shí)間可能會(huì)是real的好幾倍。
CPU時(shí)間和墻鐘時(shí)間的差別是,墻鐘時(shí)間包括各種非運(yùn)算的等待耗時(shí),例如等待磁盤I/O、等待線程阻塞,而CPU時(shí)間不包括這些耗時(shí)
可以使用一些離線的工具來對GC日志進(jìn)行分析,比如sun的gchisto( https://java.net/projects/gchisto),gcviewer( https://github.com/chewiebug/GCViewer ),這些都是開源的工具,用戶可以直接通過版本控制工具下載其源碼,進(jìn)行離線分析。
必看:
https://www.jianshu.com/p/fd1d4f21733a
https://www.jianshu.com/p/088d71f20a47
https://www.jianshu.com/p/5bad514071ab
https://www.jianshu.com/p/8eabaf631d15
https://www.jianshu.com/p/26f95965320e
https://www.jianshu.com/p/fd1d4f21733a
https://www.jianshu.com/p/dbaabe4554b6
老年代默認(rèn)是占整個(gè)堆的2/3的大小
如果程序啟動(dòng)時(shí),頻繁發(fā)生元空間的Full GC,就會(huì)啟動(dòng)很慢,需要調(diào)大元空間值。
每秒產(chǎn)生的對象較大,survior區(qū)放不下,所以放到老年代,但是這些對象其實(shí)都是垃圾。
總結(jié)
以上是生活随笔為你收集整理的JVM调优技巧与经验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: idea(一)使用详解
- 下一篇: 面试必问,如何控制多个线程的执行顺序