java 线上运维_一次java应用线上运维实战
背景:今天深圳項(xiàng)目出現(xiàn)負(fù)載狂飆的情況,由我負(fù)責(zé)主要的運(yùn)維,簡單記錄運(yùn)維的情況
一、首先使用top命令查看java進(jìn)程對資源的使用情況。
通過%CPU、%MEM的參數(shù)信息可以看出當(dāng)前進(jìn)程瘋狂占用CPU(使用量最高已經(jīng)彪到了百分之3000多),內(nèi)存使用情況占用到80%以上,8G內(nèi)存。
二、首先先著手分析內(nèi)存會(huì)不會(huì)溢出,因?yàn)楫?dāng)前zabbix報(bào)警系統(tǒng)的出發(fā)點(diǎn)是內(nèi)存大于80%將會(huì)觸發(fā)報(bào)警
首先使用 jmap -heap PID 看進(jìn)行堆使用情況,根據(jù)Heap Usage的數(shù)據(jù)顯示,當(dāng)前堆內(nèi)存使用情況還有剩余1G的內(nèi)存空間,其中 700m的空閑空間在分布新生待,300m的空間分布在老年代。
附上JVM 內(nèi)存圖
在這里可以得出結(jié)論,堆內(nèi)存空間還是相對充足,不會(huì)出現(xiàn)堆內(nèi)存溢出的情況。
思考:jvm內(nèi)存占用情況=堆內(nèi)存使用情況+非堆內(nèi)存使用情況
接下里驗(yàn)證非堆內(nèi)存使用的情況(也是上圖的右邊區(qū)域)
jstat -gcmetacapacity PID 看meta space 使用情況
結(jié)果發(fā)現(xiàn)metaspace 占用的內(nèi)存其實(shí)不高,大概只有200m左右
ps -o rss vsz -p PID 根據(jù)rss值確認(rèn)實(shí)際占用內(nèi)容多少
RSZ是Resident Set Size,常駐內(nèi)存大小,即進(jìn)程實(shí)際占用的物理內(nèi)存大小, 在現(xiàn)在這個(gè)例子當(dāng)中,RSZ和實(shí)際堆內(nèi)存占用差了1個(gè)多G,根據(jù)網(wǎng)上資料顯示這1個(gè)多G的內(nèi)存組成分別為:
1.JVM本身需要的內(nèi)存,包括其加載的第三方庫以及這些庫分配的內(nèi)存
2.NIO的DirectBuffer是分配的native memory
3.內(nèi)存映射文件,包括JVM加載的一些JAR和第三方庫,以及程序內(nèi)部用到的。上面 pmap 輸出的內(nèi)容里,有一些靜態(tài)文件所占用的大小不在Java的heap里,因此作為一個(gè)Web服務(wù)器,趕緊把靜態(tài)文件從這個(gè)Web服務(wù)器中人移開吧,放到nginx或者CDN里去吧。
4.JIT, JVM會(huì)將Class編譯成native代碼,這些內(nèi)存也不會(huì)少,如果使用了Spring的AOP,CGLIB會(huì)生成更多的類,JIT的內(nèi)存開銷也會(huì)隨之變大,而且Class本身JVM的GC會(huì)將其放到Perm Generation里去,很難被回收掉,面對這種情況,應(yīng)該讓JVM使用ConcurrentMarkSweep GC,并啟用這個(gè)GC的相關(guān)參數(shù)允許將不使用的class從Perm Generation中移除, 參數(shù)配置: -XX:+UseConcMarkSweepGC -X:+CMSPermGenSweepingEnabled -X:+CMSClassUnloadingEnabled,如果不需要移除而Perm Generation空間不夠,可以加大一點(diǎn): -X:PermSize=256M -X:MaxPermSize=512M
5.JNI,一些JNI接口調(diào)用的native庫也會(huì)分配一些內(nèi)存,如果遇到JNI庫的內(nèi)存泄露,可以使用valgrind等內(nèi)存泄露工具來檢測
6.線程棧,每個(gè)線程都會(huì)有自己的棧空間,如果線程一多,這個(gè)的開銷就很明顯了
因?yàn)檫@次負(fù)責(zé)的是運(yùn)維工作,無法實(shí)際上從代碼層面解決問題,所以采取的抑制內(nèi)存報(bào)警的策略是通過調(diào)低堆內(nèi)存的最大空間,因?yàn)槎褍?nèi)存的使用空間還剩很多,另外,檢測到了其中一臺(tái)機(jī)子是16g內(nèi)存,在80%使用時(shí)已經(jīng)報(bào)警,實(shí)際到了報(bào)警情況還有剩余4g的內(nèi)存空間,是很大的,所以結(jié)合上述參考的情況,把-Xms的值調(diào)小,原來是-Xms=-Xmx=12g,讓內(nèi)存在被使用時(shí)才被占用。
另外對于CPU占用過高的問題,可以通過打印線程棧的方式找到對應(yīng)的線程:
top -Hp PID 找出最高線程編號(hào)
print “%x\n” 28178 獲取線程16進(jìn)制地址
jstack PID |grep -10 (線程十六進(jìn)制編號(hào))
找出具體類,聯(lián)系產(chǎn)品組進(jìn)行修改
與50位技術(shù)專家面對面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的java 线上运维_一次java应用线上运维实战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java线程运行无限次_java程序运行
- 下一篇: java中ra怎么解释_JAVA个人相关