如何监控Java非堆内存使用情况?

如何监控Java非堆内存使用情况?

我需要运行一堆 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)。

在此处输入图片描述

非常感谢。

相关内容