簡體   English   中英

在 docker 容器內運行時,HeapDumpOnOutOfMemoryError 不會轉儲堆

[英]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 日志來驗證問題。

(JVM) 參數不是 JAR 的一部分。

當您嘗試將帶有 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM