公司有個采集項目,因為請求量較大,添加了redis集群,並且升級了原有的jdk1.7到jdk1.8版本,之后問題就出來了。
1.程序運行一段時間就自動停止,必須重啟才能再次運行。
2.redis連接監控查看,有大量連接阻塞,導致redis數據處理極慢,甚至不處理請求。
經過一段時間的排查才發現問題的關鍵——JDK啟動參數設置問題
原jdk1.7啟動設置為:
java -jar -server -Xmx1024m -Xms1024m -Xmn256m -Xss256k -XX:PermSize=128m /opt/source/crawler-storage/dev.crawler.storage1.jar > /opt/source/crawler-storage/info.out &
問題就發生在標紅位置,升級為jdk1.8后還是使用了這個啟動參數,導致問題出現。
修改后jdk1.8啟動參數后問題解決,其他參數也有修改,但是主要還是這個永久代參數
/opt/jdk-1.8/jdk1.8.0_191/bin/java -jar -server -Xmx1024m -Xms1024m -Xmn256m -Xss256k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC /opt/source/crawler-storage/dev.crawler.storage1.jar > /opt/source/crawler-storage/info.out &
JDK內存
jdk內存實際是jvm內存,jvm有一個運行時數據區,其實就是對這一部分的大小分配。
運行時數據區通常包括這幾個部分:程序計數器(Program Counter Register)、Java棧(VM Stack)、本地方法棧(Native Method Stack)、方法區(Method Area)、堆(Heap)
Xss:每個線程的stack大小(棧)
Xmx:JAVA HEAP的最大值、默認為物理內存的1/4
Xms:JAVA HEAP的初始值,server端最好Xms與Xmx一樣
Xmn:JAVA HEAP young區的大小
XX:PermSize:設定內存的永久保存區域
XX:MaxPermSize:設定最大內存的永久保存區域
在JDK1.8中,取消了PermGen,取而代之的是Metaspace,所以PermSize和MaxPermSize參數失效,取而代之的是
-XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m
修改JDK內存
linux下:在tomcat的bin目錄下編輯catalina.sh
cygwin=false上面加入
JAVA_OPTS="-Xms1024m -Xmx1024m -Xss1024K -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize1024m"