簡體   English   中英

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的數量而有所不同。 確切的公式可以在這里找到。 可以使用-XX:CICompilerCount=N手動覆蓋編譯器線程的數量-XX:CICompilerCount=N JVM選項。
  2. nid (Native ID)是OS給出的線程的唯一ID。 在Linux上,它是gettid()返回的數字 在你的情況下TID = 0x7d72 = 32114。
  3. [0x0000000000000000]這里與waiting on condition無關。 括號中打印的是與頁面大小對齊的最后一個已知Java堆棧幀的堆棧指針。 由於編譯器線程不是真正的Java線程,因此它沒有最后的Java SP,因此打印為零。

由於我還沒有足夠的聲譽來評論,我寫這個作為答案,雖然我不打算重新回答已經說得好的和完全的。

只是想澄清一下堆棧跟蹤中的“nid”是在“ps”或“top”輸出中看到的進程ID,除了它以十六進制格式給出。 對於將高CPU使用的進程與罪魁禍首Java線程及其堆棧聯系起來非常有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM