如何从 运行 JVM 捕获堆转储

How to Capture a Heap Dump from a Running JVM

我在 ec2 amazon 服务器上有一个 Elasticsearch 集群 运行ning。如本 article 中所述,从 运行ning JVM 捕获堆转储的方法是使用 jmap:

sudo jmap -dump:format=b,file=heap.hprof {processID}

error: {processID}: well-known file is not secure

Jmap 要求用户 运行 进程,所以我必须执行如下命令:

sudo -u elasticsearch jmap -dump:format=b,file=heap.hprof {processID}

error:

Dumping heap to /home/ubuntu/heap.hprof ...

Permission denied

所以我想我必须像这样使用 jmap:

sudo -u elasticsearch sh -c "sudo jmap -dump:format=b,file=heap.hprof {processID}"

[sudo] password for elasticsearch:

elasticsearch 用户密码是多少?有一些默认值吗?我没有找到任何解决方案...

您需要将要写入的目录设置为可写入的用户,或者您可以使用每个用户都可以写入的目录,例如

sudo -u elasticsearch jmap -dump:format=b,file=/tmp/es-heap.hprof {processID}

解决方案是 运行 以 root 身份映射,但要确保该文件可由 Java 应用程序写入。认为 jmap 向 java 应用程序发送转储命令,但转储是 运行 在它里面

sudo jmap -dump:format=b,file=/path/to/writable/directory/by/elastic/user/heap.hprof {processID}

就是这样