You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用jstat从Docker容器中获取Java应用的GC日志数据

从宿主机获取容器内Java应用GC数据

这是最常用的场景,操作门槛最低:

  • 第一步先查询目标Java应用对应的容器ID/名称,执行命令:docker ps
  • 第二步查询容器内Java进程的PID,执行命令:docker exec <目标容器ID/名称> jps -l,返回结果中对应你的应用主类/Jar包的进程ID就是目标PID,单Java进程的容器默认PID为1
  • 第三步直接执行jstat命令获取GC数据,示例命令:docker exec <目标容器ID/名称> jstat -gc <Java进程PID> 1000 10,其中1000代表每1000ms采样一次,10代表累计采样10次,可根据需求自行调整参数
  • 注意:如果容器内Java进程是用非root用户启动的,exec时需要指定对应用户,否则会报权限错误:docker exec --user <容器内Java进程所属用户名> <目标容器ID/名称> jstat -gc <Java进程PID>
从同宿主机的其他容器获取GC数据

有两种常用方案可选:

  • 方案1:挂载Docker套接字实现exec操作
    启动你用来执行jstat的容器时,添加参数挂载宿主机的docker sock:docker run -v /var/run/docker.sock:/var/run/docker.sock <你的操作容器镜像>
    容器内安装Docker客户端后,操作逻辑和上述宿主机操作完全一致,直接用docker exec调用目标容器的jstat即可
  • 方案2:通过容器内网+JMX连接
    1. 启动目标Java容器时,给应用添加JMX启动参数:
      -Dcom.sun.management.jmxremote
      -Dcom.sun.management.jmxremote.port=9999
      -Dcom.sun.management.jmxremote.authenticate=false
      -Dcom.sun.management.jmxremote.ssl=false
      -Djava.rmi.server.hostname=<目标容器的内网IP/容器名称>
      
    2. 确保两个容器加入同一个Docker网络,网络互通
    3. 在操作容器内执行jstat命令连接:jstat -gc service:jmx:rmi:///jndi/rmi://<目标容器内网IP/容器名称>:9999/jmxrmi 1000 10

注意:优先推荐使用docker exec的方案,不需要修改原有应用的启动参数、不需要额外暴露端口,安全性和便捷性更高,仅长期监控场景建议配置带身份认证的JMX方案。

内容的提问来源于stack exchange,提问作者Mahesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 16:45:06