以下代码创建100个新的Java线程并运行它们.
class ThreadTest {
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
final int tNo = i;
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread #" + tNo);
}
}).start();
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行上面的代码并使用strace记录由此执行的系统调用时,我找不到任何正在创建新线程的系统调用(可能是clone()).
但是当我使用ps -eLf命令检查上述进程的线程时,它会列出(> 100)具有不同线程ID的线程.
如何在没有任何系统调用的情况下创建这些线程?如果jvm在用户空间中创建线程,则ps -eLf不应列出这些线程.
strace命令的输出
mprotect(0xf95000, 8876032, PROT_READ|PROT_EXEC) = 0
munmap(0xf7762000, 92395) = 0
mmap2(NULL, 331776, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0xfffffffff770f000
mprotect(0xf770f000, 4096, PROT_NONE) = 0
clone(child_stack=0xf775f494, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0xf775fbd8, tls=0xf775fbd8, child_tidptr=0xffdb53d0) = 31692
futex(0xf775fbd8, …Run Code Online (Sandbox Code Playgroud) 在Java中,所有公共非静态方法都是虚拟的.这意味着要调用哪个方法是在运行时决定的(动态绑定).在C++中,虚函数(动态绑定)是使用vpointer和vtable实现的.我想知道Java是如何实现的.Java是否也使用vpointer和vtable如C++或其他一些技术来知道在运行时调用哪种方法?
我创建了一个从我的主文件夹到/ etc /的软链接
"ln -s /etc/ foo"
Run Code Online (Sandbox Code Playgroud)
然后我将目录更改为foo
"cd foo"
Run Code Online (Sandbox Code Playgroud)
现在我执行了以下两个命令
"pwd" 和 "/bin/pwd"
两者都给了我不同的输出.
"pwd"的输出是/ home/myhome/foo,"/ bin/pwd"的输出是/ etc.虽然两个命令都是相同的,但我无法理解输出的差异.
我可以使用以下代码打印指针的地址
#include<stdio.
int main(){
int *q =(int*) malloc(4);
printf("%x\n",q);
}
Run Code Online (Sandbox Code Playgroud)
当我执行以下代码时,将打印十六进制值.它是堆上变量q的虚拟地址还是物理地址?如果它是虚拟的,我应该如何打印另一个?