6
    $ jcmd -l 
    418 sun.tools.jcmd.JCmd -l

    $ jstat -gcutil -t 10 250ms 1
    10 not found

我知道 jdk 中的错误与将 jstat 作为 root 附加到以不同用户身份运行的进程有关。

在这里,这个 docker 容器有一个 root 用户,从下面的 ps 命令可以看出,cassandra 在 root 下运行。

 $ whoami
 root

我尝试执行以下操作: $ sudo -u root jcmd -l

任何帮助表示赞赏。

Docker容器是debian:jessie运行java版本:openjdk版本“1.8.0_66-internal”

这是 ps -ef 的输出:

UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 17:40 ?        00:00:00 /bin/bash /run.sh
root        10     1 11 17:40 ?        00:02:25 java -ea -javaagent:/usr/share/c
root       375     0  0 17:49 ?        00:00:00 bash
root       451   375  0 18:00 ?        00:00:00 ps -ef

另外:jstack 成功地转储了线程的堆栈跟踪。

4

1 回答 1

10

我知道至少有两个可能的原因导致这种情况发生。

  1. Java 使用-XX:+PerfDisableSharedMem选项运行。此选项有时有助于减少 JVM 安全点暂停,但它也使 JVM 对jps和不可见jstat。这是一个很可能的情况,因为您正在运行 Cassandra,而最近的 Cassandra默认情况下将此选项设置为 ON
  2. Java 进程具有不同的挂载命名空间,因此/tmpJava 进程的物理目录与/tmp您的 shell 的目录不同。该目录/tmp/hsperfdata_root必须可访问才能使用jpsjstat。这也是一个合理的原因,因为您使用的是 docker 容器。
于 2015-12-02T01:22:23.787 回答