如何从正在运行的JVM捕获堆转储

时间:2016-05-03 16:16:05

标签: elasticsearch amazon-ec2 jvm

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

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

错误:   {processID}:众所周知的文件不安全

Jmap需要运行该进程的用户,因此我必须执行如下命令:

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

错误:

     

将堆转储到/home/ubuntu/heap.hprof ...

     

许可被拒绝

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

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

[sudo]密码:

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

2 个答案:

答案 0 :(得分:2)

您需要创建要写入的目录,可以写作用户写入,或者您可以使用每个用户可以写入的目录,例如。

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

答案 1 :(得分:0)

解决方案是以root用户身份运行jmap,但请确保该文件可被Java应用程序写入。认为jmap将dump命令发送到Java应用程序,但是dump在其中运行了

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

就这样