【问题标题】:C2 CompilerThread in javajava中的C2编译器线程
【发布时间】:2017-08-24 10:31:53
【问题描述】:

我在 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. 为什么条件地址绝对为零?

【问题讨论】:

  • nid 是十六进制的线程的进程ID。你应该可以在 /proc 下找到它。

标签: java jvm jit


【解决方案1】:
  1. 编译器线程数是根据 JVM 人体工程学自动确定的。它可能会因可用 CPU 的数量而异。确切的公式可以在here 找到。可以使用-XX:CICompilerCount=N JVM 选项手动覆盖编译器线程的数量。
  2. nid (Native ID) 是 OS 给定的线程的唯一 ID。在 Linux 上,它是由 gettid() 返回的数字。在您的情况下,TID = 0x7d72 = 32114。
  3. [0x0000000000000000] 这里与waiting on condition 无关。括号中打印的是与页面大小对齐的最后一个已知 Java 堆栈帧的堆栈指针。由于编译器线程不是真正的 Java 线程,它没有最后一个 Java SP,因此打印为零。

【讨论】:

  • 感谢您的完整回答,安德烈。我以为问题会在这里。
  • 如果nidgettid() 返回的数字,那么问题中的tid 是什么?
  • @Steephen tidThread 结构的地址 - JVM 内部线程的内部表示。
猜你喜欢
  • 2018-01-04
  • 2016-02-18
  • 1970-01-01
  • 2020-03-16
  • 2012-11-10
  • 1970-01-01
  • 2010-10-06
  • 2012-06-09
  • 1970-01-01
相关资源
最近更新 更多