Как контролировать использование памяти 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).

Большое спасибо.

0 ответов

Другие вопросы по тегам