docker java 内存分配_Docker容器中的JVM内存分配

为了纪念过去的美好时光……

2a227df2eca7816e57e100848973da30.png

> The logo that takes you to 90's

默认情况下,JVM会根据系统内存自动分配一些内存。 即使它在Docker容器中运行,JVM也会(尝试)分配整个系统内存的一部分。

docker run java java -XshowSettings:vm -versionVM settings:    Max. Heap Size (Estimated): 444.50M    Ergonomics Machine Class: server    Using VM: OpenJDK 64-Bit Server VM

但是可以限制Docker容器使用最大内存量,并且使用更多内存的任何容器都将被杀死。

这对于由JVM创建的容器是一种危险。 如果容器的内存少于JVM分配的内存怎么办? 它会立即被杀死。

docker run -m 300MB java java -XshowSettings:vm -versionVM settings:    Max. Heap Size (Estimated): 444.50M    Ergonomics Machine Class: server    Using VM: OpenJDK 64-Bit Server VM

如您所见,JVM仍分配444.5 Mb RAM,这将导致该容器被杀死。

设置JVM的最大内存分配我们还可以将JVM配置为使用带有-Mxm和-Mxs选项的最小和最大内存。 在这种情况下,JVM所使用的内存不会超过最大值。

实际上,这似乎解决了我们的问题。 如果我们同时设置了容器内存和JVM最大内存,那将是安全的。

但是,有一天,如果我想更改容器内存分配,我也需要更改JVM选项。 另外,我需要对JVM设置多少最大内存进行有根据的猜测。 因为堆内存不是JVM所需的唯一内存。 如果我设置更高的值,那么容器将再次处于危险之中!

在这里使用CGroup选项来抢救借助新的CGroup内存限制选项帮助,我们可以使JVM根据容器内存限制而不是整个系统内存分配尽可能多的内存!

6bf85ae27ad776c95b4a5ddeeb36e44e.png

docker run -m 300MB java java \\-XX:+UnlockExperimentalVMOptions \\-XX:+UseCGroupMemoryLimitForHeap \\-XX:MaxRAMFraction=1 -XshowSettings:vm \\-versionVM settings:    Max. Heap Size (Estimated): 267.00M    Ergonomics Machine Class: server    Using VM: OpenJDK 64-Bit Server VM

如您所见,现在JVM知道她正在一个只有300 MB内存的容器中运行,并据此进行调整。

如果您运行诸如Kubernetes或Mesos之类的容器编排,这比预先为JVM设置硬编码内存限制要好。 您只关心容器内存,JVM会自行调整。

在本地计算机上进行测试在我的实验中,我从300 MB的容器内存开始,然后逐渐增加以了解JVM如何分配内存。 在某个时候,JVM停留在1.74 GB的内存分配上。 即使我为容器分配了4Gb内存,JVM仍然只能分配1.74 Gb内存。

经过数小时的绝望,我发现这与我的本地Docker vm内存限制设置为2Gb有关。 这就是为什么JVM永远不能超过1.74 Gb内存分配的原因。 在我将其设置为4Gb之后,JVM能够按预期分配更多的内存。

c7f2e81b0fe7a36dc1e8288a35d87e7b.png

> Docker max memory limit

骇客入侵。

(本文翻译自Evren Yortuçboylu的文章《JVM Memory Allocation in Docker Container》,参考:https://medium.com/@yortuc/jvm-memory-allocation-in-docker-container-a26bbce3a3f2)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值