【问题标题】:How do you limit non-heap size on Open JDK 11如何在 Open JDK 11 上限制非堆大小
【发布时间】:2020-12-08 08:17:49
【问题描述】:

我们在 AWS 中运行基于 openjdk:11-slim 的 docker 容器。我们通常使用两种实例类型。一个有 1G,另一个有 2G 可用内存。在 1G 实例上,我已经开始使用这些参数来限制堆大小: -XX:MaxRAM=1g -XX:MaxRAMPercentage=30

我也想限制非堆。它是一个 Spring Boot 应用程序,在 Spring Boot Admin 中它目前看起来像这样(默认运行):

如您所见,1.33 GB Max 甚至都行不通,因为总内存只有 1G。理想情况下,非堆也应限制在 30% 以内。我可以使用哪些 JVM 参数来调整非堆内存的大小?

我进行了一些调查,在这个实例中,大约 30% 的 1G 总 RAM 已用于非应用程序相关的进程(第三列是总内存的百分比)。

3663 root      4.6 /usr/bin/python2.7 /usr/bin/aws logs push --config-file /etc/awslogs/awslogs.conf --additional-configs-dir /etc/awslogs/config
 3430 root      4.1 /usr/bin/dockerd --storage-driver devicemapper --storage-opt dm.thinpooldev=/dev/mapper/docker-docker--pool --storage-opt dm.use_deferred_removal=true --storage-opt dm.use_deferred_deletion=true --storage-opt dm.fs=ext4 --storage-opt dm.basesize=100G
 2949 healthd   3.5 puma 2.11.1 (tcp://127.0.0.1:22221) [healthd]
 3021 root      2.6 /usr/bin/python2.7 /opt/aws/bin/cfn-hup
 3437 root      2.2 containerd --config /var/run/docker/containerd/containerd.toml --log-level info
 4867 root      2.1 docker logs -f f82ef403ef45
 4831 root      2.0 docker wait f82ef403ef45
 3501 root      1.9 docker events
 3322 root      1.7 /sbin/dmeventd
16976 root      0.7 sshd: ec2-user [priv]
 2280 root      0.6 /usr/bin/amazon-ssm-agent

【问题讨论】:

  • 简短回答:你不能(但你可以监控某些堆外区域并减小它们的大小)。更长的答案:见this、this和this。

标签: java jvm jvm-arguments openjdk-11


【解决方案1】:

你不能限制堆外内存,否则应用程序会崩溃。直接内存分配的时候,总是需要的,所以拒绝就和OutOfMemoryError一样。

您可以使用-XX:MaxMetaspaceSize= 限制元空间大小。

使用-XX:ReservedCodeCacheSize=,您可以减少 JIT 编译器用于存储已编译方法的内存量,因此可能会减少编译。

【讨论】:

    猜你喜欢
    • 2011-01-19
    • 1970-01-01
    • 2020-08-30
    • 2021-02-06
    • 2010-09-11
    • 2019-10-08
    • 2020-09-05
    • 2019-05-19
    相关资源
    最近更新 更多