如何使用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连接
- 启动目标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/容器名称> - 确保两个容器加入同一个Docker网络,网络互通
- 在操作容器内执行jstat命令连接:
jstat -gc service:jmx:rmi:///jndi/rmi://<目标容器内网IP/容器名称>:9999/jmxrmi 1000 10
- 启动目标Java容器时,给应用添加JMX启动参数:
注意:优先推荐使用docker exec的方案,不需要修改原有应用的启动参数、不需要额外暴露端口,安全性和便捷性更高,仅长期监控场景建议配置带身份认证的JMX方案。
内容的提问来源于stack exchange,提问作者Mahesh
相关产品推荐
相关产品推荐

