Как контролировать использование памяти Java без кучи?
Мне нужно запустить несколько Java-процессов, и я не уверен, каково может быть их максимальное использование кучи. Чтобы лучше использовать кучу памяти сервера, я попробовал решение, описанное в пункте 1 . В документации я нашел, что в основном нужно вызвать GC, размер кучи будет изменен.
Сборщик G1 рассматривает возможность изменения размера кучи Java только во время приостановки примечания и полного GC.
Проблема, с которой я столкнулся, заключается в том, что Java по-прежнему использует гораздо больше памяти RES, чем я ожидал. Первый пример — мастер Дженкинса. Вот Docker-компон для его запуска:
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 вспомогательный
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
Таким образом, он едва использует 1 ГБ кучи (и 128 МБ метапространства), но 4 ГБ памяти RES.
Я также заметил, что если я оставлю VisualVM открытым, он внезапно начнет использовать около 5 ГБ памяти (но в приведенном выше примере я не использовал VisualVM).
Большое спасибо.