我需要运行一堆 Java 进程,但我不确定它们的最大堆使用量是多少。为了更好地利用服务器的堆内存,我尝试了1。我在文档中发现,基本上需要调用 GC,然后才会调整堆的大小。
G1 收集器仅考虑在 Remark 和 Full GC 暂停期间调整 Java 堆的大小。
我面临的问题是 Java 仍然使用了比我预期更多的 RES 内存。第一个例子是 Jenkins master。以下是启动它的 Docker compose:
version: '3.9'
services:
jenkins_master:
image: jenkins/jenkins:2.387.1-lts-jdk17
environment:
- JENKINS_OPTS=--prefix=/jenkins --sessionTimeout=60 --httpKeepAliveTimeout=3600000
- JAVA_OPTS=-DjenkinsMaster -Xms512M -Xmx4G -XX:MetaspaceSize=1G -XX:MaxMetaspaceSize=1G -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20 -XX:GCTimeRatio=1 -XX:+UseG1GC -XX:G1PeriodicGCInterval=1000
network_mode: host
volumes:
- /jenkins_artifacts/.jenkins_testing:/var/jenkins_home
logging:
driver: json-file
options:
max-size: 500m
restart: "unless-stopped"
辅助
ps aux | grep jenkinsMas
user 73447 102 3.1 16632744 **4168532** ? Sl Sep25 10811:39 java -Duser.home=/var/jenkins_home -DjenkinsMaster -Xms512M -Xmx4G -XX:MetaspaceSize=1G -XX:MaxMetaspaceSize=1G -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20 -XX:GCTimeRatio=1 -XX:+UseG1GC -XX:G1PeriodicGCInterval=1000 -Djenkins.model.Jenkins.slaveAgentPort=50000 -Dhudson.lifecycle=hudson.lifecycle.ExitLifecycle -jar /usr/share/jenkins/jenkins.war --prefix=/jenkins --sessionTimeout=60 --httpKeepAliveTimeout=3600000
因此,它几乎只使用 1GB 的堆(和 128MB 的元空间),但使用了 4GB 的 RES 内存。
我还注意到,如果我让 VisualVM 保持打开状态,它会突然开始使用大约 5GB 的内存(但在上面的例子中我没有使用 VisualVM)。
非常感谢。