生產(chǎn)服務(wù)器使用docker進(jìn)行部署麻诀,有一個(gè)服務(wù)經(jīng)常出現(xiàn)java.lang.OutOfMemoryError: Java heap space問題,一般是因?yàn)?br>
1傲醉、代碼里有遞歸蝇闭,死循環(huán)
2、查詢了超大量數(shù)據(jù)
我這邊沒有以上兩種清空硬毕,但是始終找不到原因
于是修改了docker中jvm的配置信息呻引,jvm出現(xiàn)oom異常時(shí)由docker容器自動(dòng)重啟,變相的解決oom的問題吐咳。具體方法如下
1逻悠、在dockerfile中添加-XX:+ExitOnOutOfMemoryError 配置,整體如下
FROM openjdk:8
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ENV LANG C.UTF-8
#ENV LANGUAGE zh_CN:zh
#ENV LC_ALL zh_CN.UTF-8
RUN sh -c 'touch /opt/xinkao-modules-consume.jar'
ENV JAVA_OPTS="-Xms300m -Xmx300m -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+ExitOnOutOfMemoryError"
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /opt/xinkao-modules-consume.jar" ]
2、docker run 添加--restart=always參數(shù)
docker run --restart=always -d -v $PWD:/opt/ --network host --name yxy-consume yxy-consume
3韭脊、最后說下jvm的一些配置參數(shù)
-verbose:gc 打印每次垃圾回收事件信息 和 -XX:+PrintGC 效果一樣童谒,官方文檔中有說明:兩者功能一樣,都用于垃圾收集時(shí)的信息打印沪羔。但是也有不同點(diǎn):
-verbose:gc 是 穩(wěn)定版本
XX:+PrintGC 是 非穩(wěn)定版本
Xms256m 配置初始堆大小 256m
-Xmx24g 最大堆大小 24g
-Xmn8g 年輕代大小 8g
-XX:+PrintGCDateStamps 此參數(shù)主要定義GC Log 的時(shí)間戳信息饥伊,通常以“基準(zhǔn)時(shí)間”形式打印。
例如2022-06-07T08:09:50.902+0800: 51117.527: [GC (Allocation Failure) [PSYoungGen: 1195854K->17659K(1205248K)] 1288769K->110574K(1311744K), 0.0581524 secs] [Times: user=0.04 sys=0.00, real=0.05 secs]
-XX:+PrintGCDetails 打印gc詳細(xì)信息 格式如下
[GC (Allocation Failure) [PSYoungGen: 1195854K->17659K(1205248K)] 1288769K->110574K(1311744K), 0.0581524 secs]
Xloggc:log/gc-%t.log 定義GC Log 的存儲(chǔ)路徑以及所輸出的文件名稱任内。
-XX:+UseGCLogFileRotation 定義GC Log 的滾動(dòng)功能,需要進(jìn)行開啟或關(guān)閉融柬,其通乘类拢基于Xloggc配置一起使用
-XX:NumberOfGCLogFiles=2 主要定義滾動(dòng)日志文件的個(gè)數(shù)
對(duì)應(yīng)的日志文件 命名策略為:<filename>.0、<filename>.1粒氧、 ... 越除、 <filename>.n-1等
-XX:GCLogFileSize=100M 定義滾動(dòng)日志文件的大小
當(dāng)前寫日志文件大小超過該 參數(shù)值時(shí),日志將寫入下一個(gè)文件,依次類推摘盆。
-XX:+CrashOnOutOfMemoryError
# -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dump.hprof 發(fā)生oom自動(dòng)生成堆棧信息便于后續(xù)分析原因
# -XX:OnOutOfMemoryError=/script/restart.sh 發(fā)生oom時(shí)調(diào)用腳本重啟應(yīng)用程序
# -XX:+ExitOnOutOfMemoryError 發(fā)生oom立即退出翼雀,無(wú)任何信息文件生成,不建議使用
# -XX:+CrashOnOutOfMemoryError 發(fā)生oom后立即退出孩擂,JVM還會(huì)生成文本和二進(jìn)制崩潰文件