如何在灵活的 GAE 应用程序中正确设置 JVM 选项
Posted
技术标签:
【中文标题】如何在灵活的 GAE 应用程序中正确设置 JVM 选项【英文标题】:How to properly set the JVM options in a flexible GAE application 【发布时间】:2018-09-12 04:31:44 【问题描述】:以下是我用于 GAE 灵活 Java 8 / Jetty 应用程序的 app.yaml 文件。
runtime: java
env: flex
manual_scaling:
instances: 1
runtime_config: # Optional
jdk: openjdk8
server: jetty9
resources:
cpu: 2
memory_gb: 4.0
env_variables:
JAVA_HEAP_OPTS: -Xms3072M -Xmx3072M
health_check:
enable_health_check: False
handlers:
- url: /.*
script: this field is required, but ignored
由于某种原因,部署应用程序时未使用 JAVA_HEAP_OPTS 值。至少我不认为它被使用,因为当我 SSH 进入 docker 容器并运行以下命令时,内存值要少得多。
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
有人可以告诉我发生了什么或我需要做些什么不同的事情吗?
谢谢
【问题讨论】:
【参考方案1】:该变量仅应用于作为 docker 容器入口点运行的 Java 进程。
JAVA_HEAP_OPTS
不是一个神奇的环境变量,它会自动和全局地应用于 docker 容器内的任何 Java 随机执行。难怪当您启动自己的独立 Java 进程时看不到任何效果。
看看下面的代码,你就会明白它是如何工作的:
https://github.com/GoogleCloudPlatform/openjdk-runtime/blob/9-2018-02-28_16_02/openjdk-common/src/main/docker/docker-entrypoint.bash#L32 https://github.com/GoogleCloudPlatform/openjdk-runtime/blob/9-2018-02-28_16_02/openjdk-common/src/main/docker/setup-env.d/30-java-env.bash#L38【讨论】:
感谢您的回复。因此,如果我使用上述配置部署一个 war 文件,我如何检查运行我的 Web 应用程序的 JVM 是否应用了正确的内存设置? 我打赌 docker 容器内的ps aux | grep -- '-Xms3072M'
会向您展示 Java 进程。如果没有,请尝试ps aux | grep java
并检查您看到的内容。
好的,谢谢。我得到了进程,但是如何检查JVM内存设置是否正确?
如果您在使用ps aux
检查时看到-Xmx3027M
已正确传递给Java 进程,则您可以相信该参数将生效。如果您仍然无法检查传递了所有参数的实际 Java 命令,请尝试jps -m
。它将方便地正确列出传递给每个正在运行的 Java 进程的所有参数。如果您仍然不相信传递的参数会生效,有很多方法可以调查实时 Java 进程的内存统计信息:***.com/q/14464770/1701388 或 ***.com/q/12797560/1701388以上是关于如何在灵活的 GAE 应用程序中正确设置 JVM 选项的主要内容,如果未能解决你的问题,请参考以下文章
如何在gae中部署django应用程序时包含migrate命令