我有一个在Openshift上运行的Java应用程序。Java通过docker-entrypoint.sh文件运行
cd /usr/src/java_app
/usr/local/openjdk-8/bin/java -Xmx12g -jar application.jar --spring.profiles.active=prod >> /proc/self/fd/1 2> /proc/self/fd/1
我的Openshift deploymemt内存部分如下:
containers:
- resources:
limits:
memory: 12g
requests:
memory: 12g
我尝试使用以下选项运行jar命令:
-Xmx12g
-XX:MaxHeapSize=12g
-XX:MaxRAM=12g
-XX:+UnlockExperimentalVMOptions
-XX:+UseCGroupMemoryLimitForHeap
-XX:ErgoHeapSizeLimit=0
但是在跑步的时候
java -XX:+PrintFlagsFinal -version | grep Heap
我总是得到一个~3g的堆大小,这是我给容器的12 g的25%。如果容器给予16 G,则该值变为4g。另外,我可以看到'product'负责设置这个值,所以我猜它在代码中没有被覆盖。
跑步
java -XX:+PrintCommandLineFlags
退货
-XX:InitialHeapSize=187499968 -XX:MaxHeapSize=29999999488
我会很感激一些帮助,鉴于内存不是那么便宜
1条答案
按热度按时间ghg1uchk1#
你用的是什么版本的Java 8?旧版本的Java 8无法正确“查看”可用内存
请参阅本文,了解如何根据您的版本(即JDK 8u191之前或之后)配置Java 8
https://www.baeldung.com/ops/docker-jvm-heap-size
如果您使用的是OpenShift 4.12,请查看本文,了解最新版本的Java 8对cgroups v2的支持的许多改进,但您需要最新版本的JDK 8:
https://developers.redhat.com/articles/2023/04/19/openjdk-8u372-feature-cgroup-v2-support#