我正在尝试在 kubernetes 上运行一个 Jetty 网络服务器,它在我们的生产环境中需要大量的堆 ~ 250 GB,在我们的测试环境中 ~ 50 GB。
我正在使用jetty:9.4-jdk11
,我试图避免显式设置Xms
或Xmx
标志,因为不同环境之间的值不同,因为我认为依赖-XX:MaxRAMPercentage -XX:InitialRAMPercentage
会更好,但无论我尝试什么,我都无法MaxHeapSize
通过32178700288 ~ 30 GB。
Node 上只有 Java 应用程序和一些小 sidcar,有 64 GB 内存。
Dockerfile
FROM jetty:9.4-jdk11
ENV APP_WAR root.war
ENV APP_EXPLODED_WAR root/
ENV APP_DESTINATION_PATH $JETTY_BASE/webapps/
ENV APP_DESTINATION_WAR $APP_DESTINATION_PATH$APP_WAR
ENV APP_DESTINATION_EXPLODED_WAR $APP_DESTINATION_PATH$APP_EXPLODED_WAR
ADD . $APP_DESTINATION_EXPLODED_WAR
ENV JAVA_OPTIONS -XX:+PrintFlagsFinal -XX:MaxRAMPercentage=90 -XX:InitialRAMPercentage=90 -XX:-OmitStackTraceInFastThrow -XX:+UseStringDeduplication -Xlog:gc*,stringdedup*=debug:file=/tmp/gc.log:time
容器资源设置
resources:
limits:
cpu: "8"
memory: 60G
requests:
cpu: "6"
memory: 60G
基于这些值,我应该得到 60 GB MaxHeapSize
~ 54 GB 的 90%,而不是 30 GB。知道我缺少什么吗?
-XX:+UseCompressedOops
Java 11 上默认启用的JVM 参数是原因,来自文档。只需更改
-XX:+
为-XX:-
如上所示将禁用它。-XX:ObjectAlignmentInBytes
在我的情况下也不建议使用相同的文档。但我想它值得测试。