java 中的 C2 CompilerThread

C2 CompilerThread in java

我在 java 进程 (oracle jdk1.7_072) 上 运行 jstack 并找到这些行

"C2 CompilerThread1" daemon prio=10 tid=0x00007f1a8415d000 nid=0x7d72 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" daemon prio=10 tid=0x00007f1a8415a000 nid=0x7d71 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

我知道C2是一个字节码编译器。我有三个问题:

  1. 为什么有 2 个编译器线程?可以多一些还是少一些?如果是这样,什么时候?编译运行是否并行?
  2. nid参数是什么意思?第一个nid=0x7d72和java版本很像,是不是巧合?
  3. 为什么条件地址绝对为零?
  1. 编译器线程数是根据 JVM 人体工程学自动确定的。它可能因可用 CPU 的数量而异。可以找到确切的公式here。可以使用 -XX:CICompilerCount=N JVM 选项手动覆盖编译器线程数。
  2. nid(Native ID)是由OS给出的线程的唯一ID。在 Linux 上,它是 gettid() 返回的数字。在你的情况下 TID = 0x7d72 = 32114.
  3. 这里的
  4. [0x0000000000000000]waiting on condition无关。括号中打印的是与页面大小对齐的最后一个已知 Java 堆栈帧的堆栈指针。由于编译器线程不是真正的 Java 线程,它没有最后的 Java SP,因此打印了零。