一、內(nèi)存占用過(guò)高
1、造成服務(wù)器內(nèi)存占用過(guò)高只有兩種情況:內(nèi)存溢出或內(nèi)存泄漏
(1)內(nèi)存溢出:程序分配的內(nèi)存超出物理內(nèi)存的大小,導(dǎo)致無(wú)法繼續(xù)分配物理內(nèi)存,出現(xiàn)OOM報(bào)錯(cuò)。
(2)內(nèi)存泄漏:不再調(diào)用的對(duì)象一直占用著內(nèi)存不釋放,導(dǎo)致所占用的這塊內(nèi)存被浪費(fèi)掉,久而久之,內(nèi)存泄漏的對(duì)象堆積起來(lái),也會(huì)導(dǎo)致物理機(jī)的內(nèi)存被耗盡,出現(xiàn)OOM報(bào)錯(cuò)。
2、內(nèi)存過(guò)高的檢測(cè)辦法:
一般我們的JAVA服務(wù)器都是部署在linux機(jī)器上面,可以通過(guò)jvm自帶的命令進(jìn)行一些檢測(cè):
(1)查看對(duì)象的數(shù)目和占用內(nèi)存大小;
(2)如果需要進(jìn)一步定位問(wèn)題代碼,那么就需要把Java程序的內(nèi)存鏡像導(dǎo)出,再具體分析了,通過(guò)如下命令導(dǎo)出程序的內(nèi)存鏡像。
二、CPU使用過(guò)高
1、當(dāng)程序發(fā)現(xiàn)CPU使用過(guò)高的情況時(shí),可以使用windows系統(tǒng)的Process Explorer工具來(lái)找到CPU高消耗的線程,所以需要在Windows機(jī)器上面搭建好服務(wù)器的測(cè)試環(huán)境,盡量模擬出線上CPU飆升的情況;
2、模擬好環(huán)境后,通過(guò)任務(wù)管理器,在進(jìn)程一欄中找到Java程序的進(jìn)程號(hào);
3、下載Process Explorer工具:
4、打開(kāi)工具后,根據(jù)剛才的進(jìn)程號(hào)找到進(jìn)程;
5、然后右鍵-->Properties,再選擇Threads選項(xiàng)卡,點(diǎn)進(jìn)CPU排序,可以找到消耗CPU最多的那個(gè)線程;
6、使用科學(xué)計(jì)算器,將十進(jìn)制的線程號(hào)轉(zhuǎn)成十六進(jìn)制,比如493620-->78834;
7、到此已經(jīng)拿到了可能出問(wèn)題的進(jìn)程號(hào)和線程號(hào),接下來(lái)使用jvm內(nèi)置的命令來(lái)導(dǎo)出Java的堆棧信息:
jstack -l <進(jìn)程號(hào)> > <導(dǎo)出目錄+文件名>
8、打開(kāi)導(dǎo)出的堆棧信息,并全文搜索剛剛拿到的十六進(jìn)制的線程號(hào),就可以找到出問(wèn)題的代碼具體位置了。