![](/img/trans.png)
[英]-XX:+HeapDumpOnOutOfMemoryError Multiple heap dump creation
[英]HeapDumpOnOutOfMemoryError doesn't dump heap when run inside docker container
我在 Docker 容器中運行 Spring Boot 服務,並且POM.xml
文件有這個插件
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<jvmArguments>
-Xms1024m
-Xmx3096m
-XX:+UseConcMarkSweepGC
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=logs/heapdump.bin
-XX:+PrintGCDetails
-Xloggc:logs/data-pipeline-automation-gc.log
-XX:NativeMemoryTracking=summary
-XX:+CrashOnOutOfMemoryError
-XX:ErrorFile=logs/crashDump.log
</jvmArguments>
</configuration>
</plugin>
我看到我的服務出現 OOM,但我沒有收到heapdump.bin
或 GC 日志。 這是我在 log4j2.xml 中用於 springframework 日志的配置
<AppenderRef ref="Console" />
<AppenderRef ref="RollingFile" />
</Logger>
所以我創建了日志並將其轉儲到 Docker 容器中的 /logs 文件夾中,但我沒有 heapdump.bin 文件。 我將它放在日志中,因為它安裝在 VM 上,因此我們可以從外部訪問該文件夾內容。
有人可以在這里指出這個問題嗎? 我至少需要 GC 日志來驗證問題。
當您嘗試將帶有 JAR 參數的應用程序打包時,Eclipse 甚至會發出警告指示這一點。
spring-boot-maven-plugin
中的 JVM 參數用於使用mvn spring-boot:run
。
如果要使用 JVM 參數執行 JAR,請通過使用命令行傳遞這些參數來運行它:
java -XX:+HeapDumpOnOutOfMemoryError -jar yourjar.jar
如果您不想在每次運行程序時都編寫這些參數,您可以創建一個包裝腳本,該腳本只運行帶有參數的java
命令。
如果您真的希望 jvm 參數成為 JAR 的一部分,您可以創建另一個主類(並指定將其寫入MANIFEST.MF
), MANIFEST.MF
與另一個主類一起運行並傳遞這些參數:
java -XX:+HeapDumpOnOutOfMemoryError -cp yourjar.jar fully.qualified.name.of.Main
但是(取決於您的需要),程序需要重定向stdin
/ stdout
,找出 jar 的路徑,找出 java 安裝的路徑,並將傳遞給自身的 jvm 參數傳遞給程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.