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

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

別のユーザーとして実行されているプロセスにルートとして jstat をアタッチすることに関連する jdkのバグを認識しています。

ここで、この docker コンテナーには 1 つのユーザー 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

これが発生する可能性がある理由を少なくとも 2 つ知っています。

  1. Java は-XX:+PerfDisableSharedMemオプションで実行されます。jpsこのオプションは、JVM セーフポイントの一時停止を減らすのに役立つ場合がありますが、JVM がおよびから見えなくなりjstatます。Cassandra を実行していて、最近の Cassandra ではこのオプションがデフォルトで ON になっているため、これは非常に可能性の高いケースです。
  2. Java プロセスには異なるマウント名前空間があるため、 Java プロセスのマウント名前空間はシェル/tmpと物理的に同じディレクトリではありません。またはを使用するには、/tmpディレクトリ/tmp/hsperfdata_rootにアクセスできる必要があります。Dockerコンテナを使用しているため、これももっともらしい理由です。jpsjstat
于 2015-12-02T01:22:23.787 に答える