您的位置 首页 java

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

根本原因

OOM

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

 $ docker run -m 400MB openjdk:8 java -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XshowSettings:vm -version
VM 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 -version
VM 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 -version
VM 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 -version
VM 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 -version
VM settings:
    Max. Heap Size (Estimated): 121.81M
    Using VM: OpenJDK 64-Bit Server VM
 
openjdk version "10.0.2" 2018-07-17
OpenJDK 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 -version
OpenJDK 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-17
OpenJDK Runtime Environment (build 10.0.2+13-Debian-2)
OpenJDK 64-Bit Server VM (build 10.0.2+13-Debian-2, mixed mode)  


译文链接:

文章来源:智云一二三科技

文章标题:如何在容器中设置Java应用程序以避免内存问题和OOM?

文章地址:https://www.zhihuclub.com/180770.shtml

关于作者: 智云科技

热门文章

网站地图