1. 程式人生 > >效能測試-java記憶體溢位問題排查

效能測試-java記憶體溢位問題排查

背景:

最近測試一個智慧呼叫系統,就是AI代替人工客服批量給客戶打電話作推廣活動,在測試的過程中,應用伺服器和資料庫伺服器資源使用都挺正常的,但是長久不重啟應用,過個2-3天,執行個幾次同時呼叫600個電話撥打任務後,就可能存在:

org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.OutOfMemoryError: Java heap space

上線時間太緊了,被SB總監催著不管質量只管進度的上線。週日被開發喊來看效能問題。週一就要交差了。

這裡我想說的是,這麼久以來,我們的開發框架都非常穩定了,一般就是抓抓弱智的慢語句,看看執行緒在幹啥有沒有亂搞導致應用負載飆升。關於記憶體這方面,可以說沒有那麼大的需求那個高的要求,一直都沒啥進步,都是吃老本,包括使用的工具,也是幾年都沒變的Java VisualVM,變的只有是從jdk1.6升級到了1.8

關於記憶體溢位

網上的資料全是坑,都沒有一篇寫到點上的,我就發現了個問題,要查一個難點,你得至少結合30篇部落格的知識點加上自己的悟性才能搞定一個問題。

首先,你windows本機得安裝好java,我這裡用的是java8。java的安裝這裡不累贅了。不過這裡解釋幾個名詞。以免看不懂

java:開發語言,一種名稱

jdk:java語言的軟體開發工具包,全稱是:Java Development Kit

jre:JRE是Java Runtime Environment縮寫,指Java執行環境

jvm:JVM是Java Virtual Machine(Java虛擬機器)的縮寫

VisualVM:是JAVA自帶的,一款免費的,集成了多個 JDK 命令列工具的視覺化工具,它能為您提供強大的分析能力,對 Java 應用程式做效能分析和調優

java gc:java垃圾回收,說到這個話就多了。涉及到對jvm堆中無用物件進行回收

擴充套件知識:JVM的堆是Java物件的活動空間,程式中的類的物件從中分配空間,其儲存著正在執行著的應用程式用到的所有物件。這些物件的建立方式就是那些new一類的操作,當物件無用後,是GC來負責這個無用的物件(地球人都知道)。
JVM堆
    (1) 新域:儲存所有新成生的物件
    (2) 舊域:新域中的物件,經過了一定次數的GC迴圈後,被移入舊域
    (3)永久域:儲存類和方法物件,從配置的角度看,這個域是獨立的,不包括在JVM堆內。預設為4M。

GC的工作目的很明確:在堆中,找到已經無用的物件,並把這些物件佔用的空間收回使其可以重新利用.大多數垃圾回收的 演算法思路都是一致的:把所有物件組成一個集合,或可以理解為樹狀結構,從樹根開始找,只要可以找到的都是活動物件,如果找不到,這個物件就是凋零的昨日黃 花,應該被回收了。

我們現在存在的問題就是:GC不了垃圾,導致時間久了,記憶體會溢位,這個即使增大jvm也無濟於事,只不過能延緩

這種問題如果不從程式碼層面優化,還有個欺騙領導的辦法:

1、應用 每天重啟一次,釋放垃圾

2、jvm配置原來的2倍記憶體

上面全是廢話一般的理論,下面介紹VisualVM的安裝與使用

 Java VisualVM安裝與使用

1、開啟本機上的F:\Program Files\Java\jdk1.8.0_131\bin\jvisualvm.exe即可

2、應用伺服器-即要監控的java應用部署的機器上

/usr/java/jdk1.8.0_101/bin

上傳2個檔案:連結:https://pan.baidu.com/s/1EZ460Vlz9fesExl10WnN_A  提取碼:ibjk

resin中配置:設定遠端連線埠9009

<jvm-arg>-Dcom.sun.management.jmxremote</jvm-arg>
<jvm-arg>-Dcom.sun.management.jmxremote.port=9009</jvm-arg>
<jvm-arg>-Dcom.sun.management.jmxremote.ssl=false</jvm-arg>
<jvm-arg>-Dcom.sun.management.jmxremote.authenticate=false</jvm-arg>

 啟動jstatd服務,啟動1099預設埠給客戶端監控

 nohup ./jstatd.sh &

檢視埠,是否9009和1099都啟動成功:netstat -nlp

3、visualvm連線新增監控及配置

a、裝外掛:工具-外掛,Visual GC外掛地址已經不存在了。所以線上安裝是不成功的

這裡介紹手動安裝方法

進入此頁面,下載 要用的外掛

下載後:

從本地匯入外掛進入:

然後勾選安裝 ,安裝完成即可。

遠端-右鍵-新增遠端機器

 

 如果監控的這臺機器上jstatd服務1099埠啟動了,然後允許遠端監控埠9009也啟動了,那麼這裡就會有結果

我們看應用程序 pid那一項結果