1、當(dāng)項目運行一段時間以后,產(chǎn)生了OOM的問題,我們該如何排查問題呢?
用top命令,看看是哪個進(jìn)程CPU占用率高,獲取它的進(jìn)程ID,再根據(jù)具體的進(jìn)程id,執(zhí)行 top -HP 進(jìn)程id號? 命令,看看哪個線程的CPU占用率高,如果是業(yè)務(wù)線程出現(xiàn)問題,則根據(jù)線程ID去檢查業(yè)務(wù)代碼;如果是GC線程占用率高,去看看日志再確定具體問題(有可能發(fā)生內(nèi)存泄漏)。
1、執(zhí)行jps,
列出系統(tǒng)中所有在運行的java進(jìn)程,由此可以獲取指定進(jìn)程的進(jìn)程id號
2、執(zhí)行jinfo 進(jìn)程id號 ,
可以獲取進(jìn)程的詳細(xì)信息,可以看到堆內(nèi)存設(shè)置的大小等
?3、 jstat -gc 進(jìn)程id號,
可以看到內(nèi)存中各個區(qū)域的內(nèi)存使用情況
?4、top
可以查看所有的進(jìn)程,可以看到各個進(jìn)程占用cpu的情況,并動態(tài)進(jìn)行刷新;可以根據(jù)CPU占用率找出發(fā)生問題的進(jìn)程。
?5、知道哪個進(jìn)程有問題,則執(zhí)行 top -HP 進(jìn)程id號? 命令
,可以看到指定進(jìn)程內(nèi),線程占用CPU的情況,以及線程的名稱和線程的種類(業(yè)務(wù)線程和系統(tǒng)線程)
或者是使用命令:jstack? 進(jìn)程ID | more
可以看到進(jìn)程中各線程的詳細(xì)信息,如線程狀態(tài),線程調(diào)用了哪些方法;
?
?可以用這個命令來判斷線程是否陷入死鎖,如果多個線程都在等待同一個對象,那么可能陷入死鎖。
?線程名稱如下,符合開發(fā)規(guī)范需要給每個線程賦予名字,以方便知道是哪一個線程出現(xiàn)問題
6、執(zhí)行jmap? -histo 進(jìn)程id,
可以查看Java堆轉(zhuǎn)儲快照的信息,可以知道有哪些類,這些類產(chǎn)生多少對象,占用了多少內(nèi)存。
?可以將整個堆存儲以文件的形式導(dǎo)出:
?7 可以使用jvisualVM工具,
將堆生成的文件進(jìn)行分析?
為什么在實際項目中,最大堆和最小堆的數(shù)值大多設(shè)置成一樣?文章來源:http://www.zghlxwxcb.cn/news/detail-466088.html
如果大小設(shè)置成不一樣,那么堆內(nèi)存大小會根據(jù)實際需要進(jìn)行動態(tài)的擴(kuò)張或者是縮小,而這一個過程是耗費一定資源的,影響了程序的執(zhí)行效率。如果說一臺機(jī)子就一個程序在跑,那就沒必要將最大堆和最小堆大小設(shè)置成不一樣的。文章來源地址http://www.zghlxwxcb.cn/news/detail-466088.html
到了這里,關(guān)于JVM調(diào)優(yōu)實戰(zhàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!