java如何设置soapaction_如何在容器中设置Java应用程序以避免内存问题和OOM?

根本原因

1f7c13680816b32bd4013b38c00a7d86.png

OOM

默认情况下,java应用程序将使用主机内存的1/4,而不是容器。这是Java运行的默认定义,容器外部没有选项。其余的内存用于交换,缓存等。

$ docker run -m 400MB openjdk:8 java -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XshowSettings:vm -versionVM settings:    Max. Heap Size (Estimated): 112.00M    Ergonomics Machine Class: server    Using VM: OpenJDK 64-Bit Server VM openjdk version "1.8.0_171"OpenJDK Runtime Environment (build 1.8.0_171-8u171-b11-1~deb9u1-b11)OpenJDK 64-Bit Server VM (build 25.171-b11, mixed mode)

解决

最佳配置取决于应用程序内存要求。

Java版本 < 10

从Java 8u131到Java 9,您可以使用试验性的" UseCGroupMemoryLimitForHeap"。这样就可以使用容器的1/4来针对容器的内存限制来自我管理内存值。

$ docker run -m 400MB openjdk:8 java -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XshowSettings:vm -versionVM settings:    Max. Heap Size (Estimated): 112.00M    Ergonomics Machine Class: server    Using VM: OpenJDK 64-Bit Server VM openjdk version "1.8.0_171"OpenJDK Runtime Environment (build 1.8.0_171-8u171-b11-1~deb9u1-b11)OpenJDK 64-Bit Server VM (build 25.171-b11, mixed mode)

您可以通过结合使用Java中的" -Xmx"和docker上的内存限制来避免使用实验性设置。您可以使用另一个选项,"-XX:MaxRAM =",这可以使您完全修复java使用的ram的最大数量。可以将其设置为与docker内存限制相同的数量,并且将像选项" UseCGroupMemoryLimitForHeap"一样工作。不同之处在于它不是自动的。

$ docker run -m 400MB openjdk:8 java -XX:MaxRAM=400m -Xmx300m -XX:MaxRAMFraction=1 -XshowSettings:vm -versionVM settings:    Max. Heap Size: 300.00M    Ergonomics Machine Class: server    Using VM: OpenJDK 64-Bit Server VM openjdk version "1.8.0_171"OpenJDK Runtime Environment (build 1.8.0_171-8u171-b11-1~deb9u1-b11)OpenJDK 64-Bit Server VM (build 25.171-b11, mixed mode)

您可以使用-XX:MaxRAMFraction = 1优化堆内存的使用,该内存将几乎所有可用内存用作最大堆:

$ docker run -m 400MB openjdk:8 java -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1 -XshowSettings:vm -versionVM settings:    Max. Heap Size (Estimated): 356.00M    Ergonomics Machine Class: server    Using VM: OpenJDK 64-Bit Server VM openjdk version "1.8.0_171"OpenJDK Runtime Environment (build 1.8.0_171-8u171-b11-1~deb9u1-b11)OpenJDK 64-Bit Server VM (build 25.171-b11, mixed mode)

Java版本10

现在,它已完全集成到Java 10中:

$ docker run --rm 400MB openjdk:10 java -XshowSettings:vm -versionVM settings:    Max. Heap Size (Estimated): 121.81M    Using VM: OpenJDK 64-Bit Server VM openjdk version "10.0.2" 2018-07-17OpenJDK Runtime Environment (build 10.0.2+13-Debian-1)OpenJDK 64-Bit Server VM (build 10.0.2+13-Debian-1, mixed mode)

像10之前的版本一样,您可以使用-XX:MaxRAMFraction = 1优化堆内存的使用,它将几乎所有可用的内存用作最大堆。但是此选项已被弃用,并将在未来的新版本中删除:

$ docker run -m 400MB openjdk:10 java -XshowSettings:vm -XX:MaxRAMFraction=1 -versionOpenJDK 64-Bit Server VM warning: Option MaxRAMFraction was deprecated in version 10.0 and will likely be removed in a future release.                                                                            VM settings:    Max. Heap Size (Estimated): 386.69M    Using VM: OpenJDK 64-Bit Server VM openjdk version "10.0.2" 2018-07-17OpenJDK Runtime Environment (build 10.0.2+13-Debian-2)OpenJDK 64-Bit Server VM (build 10.0.2+13-Debian-2, mixed mode)

译文链接:https://success.docker.com/article/java-app-is-killed-by-docker

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值