1

これは、再帰を使用して、引数として渡された特定の数値の階乗を見つけるシングル スレッド Java プログラムです。

class factorial{
  public static void main(String[] args){
    int number=0;
    try {
         number = Integer.parseInt(args[0]);
    }
    catch(Exception e){
        e.printStackTrace();
    }
    double result = fact(num);
    System.out.println(result);
}

static double fact(int x){
    if(x <= 1){
        return x;
    }
    else{
        return(x * fact(x-1));
    }
  }
}

シングルスレッドとして実行されているプログラムに、なぜこれほど多くの futex と clone システムコールが使用されているのか疑問に思っていました。

strace  -o javafact.txt -s10000 -f java factorial 5
grep -ic futex javafact.txt
481
grep -ic clone javafact.txt
53


19103 clone(child_stack=0x7f45ece2fff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f45ece309d0, tls=0x7f45ece30700, child_tidptr=0x7f45ece309d0) = 19104
19103 futex(0x7f45ece309d0, FUTEX_WAIT, 19104, NULL <unfinished ...>
4

1 に答える 1

3

Java は、GC、JIT コンパイラ、およびその他のいくつかの複数の JVM 内部スレッドを実行します。ここでいくつかの情報を見つけることができます: http://blog.jamesdbloom.com/JVMInternals.html#jvm_system_threads

于 2015-10-25T21:58:23.803 に答える