为什么 java 单线程程序使用 futex 和 clone 系统调用
Why a java single threaded program uses futex and clone system calls
这是一个单线程 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 和克隆系统调用用于程序 运行 作为单个线程。
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 ...>
Java 为 GC、JIT 编译器和其他一些运行多个 JVM 内部线程。您可以在这里找到一些信息:http://blog.jamesdbloom.com/JVMInternals.html#jvm_system_threads
这是一个单线程 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 和克隆系统调用用于程序 运行 作为单个线程。
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 ...>
Java 为 GC、JIT 编译器和其他一些运行多个 JVM 内部线程。您可以在这里找到一些信息:http://blog.jamesdbloom.com/JVMInternals.html#jvm_system_threads