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