web-dev-qa-db-ja.com

ps -axlを使用してLinuxで実行されているJavaスレッドを見つける方法は?

2つのスレッドで実行中のJVMがあります。 Linux OSでこれらの実行中のスレッドをps -axlで見ることは可能ですか? OSがスレッドに与えている優先順位を調べようとしています。この他の問題に関する詳細情報 こちら

23
JohnPristine

使用する

jps -v

Javaプロセス。サンプル出力:

3825 RemoteMavenServer -Djava.awt.headless=true -Xmx512m -Dfile.encoding=MacRoman
6172 AppMain -Didea.launcher.port=7533 -Didea.launcher.bin.path=/Applications/IntelliJ IDEA 10.app/bin -Dfile.encoding=UTF-8
6175 Jps -Dapplication.home=/Library/Java/JavaVirtualMachines/1.6.0_31-b04-411.jdk/Contents/Home -Xms8m

次に使用する

jstack 6172

(6172はプロセスのIDです)jvm内のスレッドのスタックを取得します。スレッドの優先順位はそこから見つけることができます。サンプル出力:

.....
"main" **prio=5** tid=7ff255800800 nid=0x104bec000 waiting on condition [104beb000]
   Java.lang.Thread.State: TIMED_WAITING (sleeping)
    at Java.lang.Thread.sleep(Native Method)
    at au.com.byr.Sample.main(Sample.Java:11)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
    at Java.lang.reflect.Method.invoke(Method.Java:597)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.Java:120)

..... 

楽しい!

編集:アプリケーションが自分とは異なるユーザーで実行されている場合(運用環境やその他の非ローカル環境での典型的なケース)、jps/jstackはSudo経由で実行する必要があります。例:

Sudo jps -v

Sudo jstack 6172
53
Petro Semeniuk

Linuxでは、Sun/Oracle JVMはJavaネイティブLinuxスレッドを使用してスレッドを実装するため、「ps」出力で確認できます。Javaprocessに属するスレッドはa Java thread。しかし、スレッドの名前は、Javaに固有であり、OSはそれらを知らないため、表示されません。

LinuxスレッドにはIDがありますが、それらは単なる数字であり、「ps axl」には表示されません。 「ps -eLf」は、「LWP」列で行います。 (「LWP」は「軽量プロセス」の略で、スレッドの別名です。)Java内では、Thread.getId()メソッドmightは、「 ps -eLf "の出力ですが、よくわかりません。

7
Wyzard

ここで説明した方法はすべて正常に機能します。私も似たようなものを探していて、これに遭遇しました blog by Timur Akhmadeev。役に立てば幸いです。

編集:

仲間のプログラマーから指摘されたように、以下はティムールの投稿の要約です。

* nuxベースのシステムでは、最初に

top -H

スレッドごとにCPU使用率を表示します。 Oracleとしてユーザーを探し、Javaとしてコマンドを探します。このプロセスのPIDをメモしてから実行します

top -H -p PID

これにより、プロセス(Javaプログラム)が現在実行しているすべてのタスクを表示するリストが表示されます。この後、各スレッドが実行しているタスクを知る必要があります。そのために、jdkが提供するユーティリティ、つまりjstackを使用します。 Linuxでは、Java(JVM HotSpot)スレッドはカーネルのスレッドにマップされます。

jstack -pid_of_the_thread

OSレベルのスレッドをスレッドダンプ内のJavaスレッドにマップするには、ネイティブスレッドIDをLinuxからベース16に変換し、スタックトレースで「nid = $ ID」を検索する必要があります。たとえば、スレッドIDは7601であり、0x1db1は監視対象である可能性があります。スレッドが今後何を行うか、つまりその動作を追跡する場合は、監視するシェルスクリプトを記述するだけです。これが理にかなっていることを願っています。

6
rkrakz

ps(1)スレッドセレクタースイッチHは、スレッドをプロセスとして表示するようps(1)に要求します。 (とにかく、おおよそどのように実装されているか。)

見る:

$ ps axl | wc -l
163
$ ps axlH | wc -l
325

どうやら、現在実行中のスレッド化されたプロセスがたくさんあるようです。

3
sarnold
  1. オプションH "on"でスレッドIDをトップで検索し、スレッドPIDを書き留めます
  2. スレッドダンプを作成し、スレッドのスタックを見つけます。 16進形式のPIDがあります。
3
vasste

JNIをネイティブコードにジャンプさせて、特定のJavaスレッドに関連付けられたネイティブTIDを取得できます。次に、他の人が示唆するか、スレッドの詳細を送り返すOSコマンドまたはprocfsを使用しますJavaまで。

例:ネイティブコード

JNIEXPORT jlong JNICALL Java_nativeGetThreadId(JNIEnv * env, jobject obj) {
    jlong threadId;
    threadId = (jlong)gettid();
    return threadId;
}
1
Java42

JDKがインストールされている場合は、 jvisualvm というツールを使用してスレッドを表示できます(そして、Javaプロセスに関連する他の多くの操作を実行します-メモリを参照、クイックチェックオブジェクトなど)

1
Jayan