5

[更新: でtop、プロセスではなくスレッドを表示する shift+H を押した後、Java スレッドが R として表示され、100% の CPU 時間を使用していることを示します。これは、この質問を投稿する前に予想していたことです。]

topJava プロセスには複数のスレッドがあり、それぞれが異なる状態にある可能性があるため、Linuxコマンドはどのようにして Java プロセスの状態を判断するのでしょうか?

次のコードを実行すると、

public class Test{
  public static void main(String[] args){
     while (true){
       int n = (int)(Math.random() * 1000);
     }
  }
}

次に、runningtopは、プロセスの状態が S であり、100% の CPU 時間を使用していることを示しています。

また、実行中のstraceショーとショーのみ:

futex(0x7f6ba759c9d0, FUTEX_WAIT, 26060, NULL

ただし、runningjstackは、メイン スレッドが RUNNABLE であることを示しています。

"main" prio=10 tid=0x00007fd7ec007800 nid=0x669b runnable [0x00007fd7f5754000]
  java.lang.Thread.State: RUNNABLE
    at Test.main(Test.java:5)

jstackまた、WAITING 状態のスレッドが 2 つしかないことも示しています。

"Finalizer" daemon prio=10 tid=0x00007fd7ec080000 nid=0x66a6 in Object.wait() [0x00007fd7f0252000]
    java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000007ad001310> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:133)
        - locked <0x00000007ad001310> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:149)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:177)

"Reference Handler" daemon prio=10 tid=0x00007fd7ec07e000 nid=0x66a5 in Object.wait() [0x00007fd7f0353000]
    java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000007ad0011e8> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:502)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
        - locked <0x00000007ad0011e8> (a java.lang.ref.Reference$Lock)
4

4 に答える 4

2

JVMには、ガベージコレクションなどの「ハウスキーピング」を実行するために実行されている多くのスレッドがあります。それらはほとんどの場合スリープ状態にあります。

于 2012-12-30T23:47:50.577 に答える
1

次に、top を実行すると、プロセスの状態が S であり、100% の CPU 時間を使用していることがわかります。

top問題は、プロセスのステータスを決定する方法にある可能性が最も高いと思います。OS レベルでは、実行/待機/スリープ状態を持つのは個々のスレッドです。私の推測ではtop、プロセスの概念的な実行/待機/スリープ状態を把握するためのコマンドのヒューリスティックは誤解を招くものです。

(そして...からの出力jstackと常識...はこの理論をサポートしています。)

于 2012-12-30T23:59:08.063 に答える
0

このスレッドは CPU をビジーに使用しており、スリープ状態ではありません。

"main" prio=10 tid=0x00007fd7ec007800 nid=0x669b runnable [0x00007fd7f5754000]
  java.lang.Thread.State: RUNNABLE
    at Test.main(Test.java:5)

これは、上部の情報が正しくないことを示しています。

于 2012-12-30T23:49:05.960 に答える
0

「なぜ複数のスレッドがあり、Java で何をするのか」については多くの説明がありましたが、何についてはあまり説明されていません。topコマンド自体は非常に単純で、情報を収集するために必要なシステム コールを実行するだけです。たとえば、getrusageCPU 使用率を取得するために使用されます。

通常、説明したように、topプロセス全体、すべてのスレッドを一度に調べます。「H」を押すtopと、プロセス全体ではなく個々のスレッドが表示され、すべての Java スレッドを表示できます [画面が十分に高い場合]、メインのスレッドがすべての CPU を使用している無限ループであり、他のスレッドは主に何もしていません。

于 2012-12-31T08:16:39.293 に答える