2014-09-25 63 views
11

我從某些文檔中讀到Hotspot VM利用一種名爲Oop Maps的數據結構來管理VM中的所有OOP。我的問題是,這個Oop Map數據結構何時生成?在編譯時或運行時?任何進一步的詳細文件都將受到歡迎。感謝你們。Oop Maps在Hotspot VM中意味着什麼

+1

有趣的提示,但爲什麼有負面評論沒有評論?有人從JVM頭疼? – jkj 2014-09-25 03:30:06

+0

我只看到一個負面投票 – 2014-09-25 03:47:08

回答

15

OopMap是一個記錄對象引用(OOP)位於Java堆棧中的結構。其主要目的是在Java堆棧上查找GC根,並在堆中移動對象時更新引用。

有三種OopMaps的:

  1. OopMaps爲解釋的方法。它們是通過分析字節碼流來懶散地計算的,即當GC發生時。
  2. OopMaps for JIT編譯方法。它們是在JIT編譯期間生成的,並與編譯後的代碼一起保存,以便VM可以通過指令地址快速找到堆棧位置和保存對象引用的寄存器。
  3. 生成的OopMaps 共享運行時存根。這些映射是由開發人員手動構建的 - 這些運行時存根的作者。
+0

這是非常酷的答案,但我想知道更多,如果不是不合適的: 1)解釋方法的OopMaps。它們是通過分析字節碼流來懶散地計算的,即當GC發生時。 >>>>>>>>這些信息在JVM中存儲在哪裏?有關他們如何計算的詳細參考?或者只是在OpenJDK中的源代碼文件? 2)所以當GC發生時,線程進入安全點,那麼JVM就可以通過檢查當前安全點中的Oop Maps來簡單地找到當前線程的所有GC根集。是正確的嗎? 非常感謝。 – 2014-09-26 03:25:00

+1

@BillRanderson 1)最好的參考是源代碼(有據可查的BTW):[generateOopMap.cpp](http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/d638e49facb6/src/share/ VM /糟糕/ generateOopMap.cpp)。 InterpreterOopMap存儲在[OopMapCache](http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/d638e49facb6/src/share/vm/interpreter/oopMapCache.hpp)中。 – apangin 2014-09-26 17:57:25

+2

@BillRanderson 2)GC JVM遍歷所有線程堆棧。每個堆棧都被解析爲一個堆棧幀流。幀可以被解釋或編譯或存根。解釋幀包含有關Java方法和bci(字節碼索引)的信息。 OopMapCache有助於查找與給定方法和bci相對應的OopMap。編譯幀的方法是通過指令地址查找來發現的。編譯的方法包含OopMaps和代碼。 – apangin 2014-09-26 18:06:46