首页 > 解决方案 > 仅获得通过 app.yaml 分配的内存的四分之一

问题描述

我们正在 appengine flex 上运行 java8/jetty9 设置。在 app.yaml 中,我们分配了 30G 的 RAM。但是在服务器中,当我们调用 时Runtime.getRuntime().maxMemory(),返回的数字是~7G。如果我将 RAM 增加到 60G,这个数字增加到 ~15G。似乎 JVM 只获得了我们在 app.yaml 中分配的 RAM 的四分之一。

我还尝试使用 -Xmx30g 运行服务器

但是服务器上传失败并出现错误

Java 运行时环境没有足够的内存来继续。

本机内存分配 (mmap) 未能映射 7158235136 字节以提交保留内存。

确认我们所看到的错误Runtime.getRuntime().maxMemory,当我们分配了 30G 的 RAM 时,有 ~7G 的限制。剩下的 75% 分配到哪里去了?

这是 Dockerfile

    FROM gcr.io/google-appengine/jetty9
    运行 apt-get -q 更新 && \
        apt-get -y -q --no-install-recommends -t jessie-backports install
    openjdk-8-jdk && \
        apt-get -y -q --no-install-recommends install ssh sshpass && \
        易于清洁 && \
        rm /var/lib/apt/lists/*_*
    添加 backend.war $JETTY_BASE/webapps/root.war
    工作目录 $JETTY_BASE
    运行 java -jar -Xmx30g -Xms20g $JETTY_HOME/start.jar --approve-all-licenses \
       --add-to-startd=jmx,stats,hawtio,requestlog \
       -Djava.util.logging.config.file=src/main/appengine/logging.properties \
       && chown -R 码头:码头 $JETTY_BASE

这是 app.yaml

    运行时:自定义
    线程安全:真
    环境:弹性

    处理程序:
    - 网址:/.*
      脚本:此字段是必需的,但被忽略
      安全:总是

    健康检查:
      enable_health_check:真
      check_interval_sec: 5
      timeout_sec: 4
      不健康阈值:2
      健康阈值:2

    资源:
      中央处理器:6
      内存_gb:30
      disk_size_gb: 20
    自动缩放:
      min_num_instances: 1
      max_num_instances:3
      冷却周期_秒:120
      cpu_利用率:
        目标利用率:0.5

标签: google-app-engineapp-engine-flexible

解决方案


 环境变量:
  JAVA_OPTS:“-Xmx16g”

将上述内容添加到 app.yaml 就可以了...


推荐阅读