我從某些文檔中讀到Hotspot VM利用一種名爲Oop Maps的數據結構來管理VM中的所有OOP。我的問題是,這個Oop Map數據結構何時生成?在編譯時或運行時?任何進一步的詳細文件都將受到歡迎。感謝你們。Oop Maps在Hotspot VM中意味着什麼
回答
OopMap是一個記錄對象引用(OOP)位於Java堆棧中的結構。其主要目的是在Java堆棧上查找GC根,並在堆中移動對象時更新引用。
有三種OopMaps的:
- OopMaps爲解釋的方法。它們是通過分析字節碼流來懶散地計算的,即當GC發生時。
- OopMaps for JIT編譯方法。它們是在JIT編譯期間生成的,並與編譯後的代碼一起保存,以便VM可以通過指令地址快速找到堆棧位置和保存對象引用的寄存器。
- 生成的OopMaps 共享運行時存根。這些映射是由開發人員手動構建的 - 這些運行時存根的作者。
這是非常酷的答案,但我想知道更多,如果不是不合適的: 1)解釋方法的OopMaps。它們是通過分析字節碼流來懶散地計算的,即當GC發生時。 >>>>>>>>這些信息在JVM中存儲在哪裏?有關他們如何計算的詳細參考?或者只是在OpenJDK中的源代碼文件? 2)所以當GC發生時,線程進入安全點,那麼JVM就可以通過檢查當前安全點中的Oop Maps來簡單地找到當前線程的所有GC根集。是正確的嗎? 非常感謝。 – 2014-09-26 03:25:00
@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
@BillRanderson 2)GC JVM遍歷所有線程堆棧。每個堆棧都被解析爲一個堆棧幀流。幀可以被解釋或編譯或存根。解釋幀包含有關Java方法和bci(字節碼索引)的信息。 OopMapCache有助於查找與給定方法和bci相對應的OopMap。編譯幀的方法是通過指令地址查找來發現的。編譯的方法包含OopMaps和代碼。 – apangin 2014-09-26 18:06:46
- 1. 域名在OOP中意味着什麼?
- 2. oop在JVM崩潰報告中意味着什麼?
- 3. 在AngularJS中結尾意味着什麼double意味着
- 4. 什麼%*%意味着R中
- 5. 什麼呢##意味着在$ {}
- 6. 什麼===在PHP意味着
- 7. 什麼。意味着在PHP?
- 8. 〜=是什麼。在Stata意味着什麼?
- 9. AccountExpirationDate意味着什麼?
- 10. PREEMPTIVE_XE_DISPATCHER這意味着什麼?
- 11. 什麼<?意味着
- 12. 什麼呢JDBC:HSQLDB:hsqlTempFiles意味着
- 13. 溢出意味着什麼?
- 14. %是什麼〜DP0意味着
- 15. void **意味着什麼
- 16. 奎因意味着什麼?
- 17. malloc意味着什麼(int *)?
- 18. Solr意味着什麼?
- 19. 什麼?意味着iOS的
- 20. Field.Index.NOT_ANALYZED_NO_NORMS意味着什麼
- 21. HttpServletResponse.SC_BAD_REQUEST意味着什麼?
- 22. * | *這意味着什麼CSS?
- 23. 什麼-Dauto意味着
- 24. 這是&意味着什麼?
- 25. $這意味着什麼PHP?
- 26. MYSQLI_NUM意味着什麼?
- 27. BC date在PostgreSQL中意味着什麼?
- 28. 「自我」在JavaScript中意味着什麼?
- 29. 這個'&'在Ruby中意味着什麼?
- 30. /(斜線)在CSS中意味着什麼?
有趣的提示,但爲什麼有負面評論沒有評論?有人從JVM頭疼? – jkj 2014-09-25 03:30:06
我只看到一個負面投票 – 2014-09-25 03:47:08