如何在 docker swarm 模式下转储 jvm 内存?

How to dump jvm memery in docker swarm mode?

我的springcloud应用是运行在dockerswarm模式下,最近发现内存占用不在正常水平。我想使用一些工具,如 jmap 或其他工具来转储堆,以便我可以更改 jvm 的参数并解决问题。

我曾尝试使用一些工具,如 arthas ,但由于 pid 1 问题而失败。我们不能附加到 id 为 1-5 的进程。

如何知道堆的使用情况(eden、survivor等)?

我认为最简单的方法是进入容器 shell 并在那里安装必要的工具。在具有应用程序容器的节点上使用它来启动交互式会话:

docker exec -u root -it <container_name> sh

完成重新创建容器并进行清理后停止容器。

如果在某些时候您需要从容器中提取文件(例如转储),请从节点上的另一个控制台使用 docker cp

docker cp <container_name>:<path_in_container> <local_path>