我从一些文档中了解到,Hotspot VM 使用一种称为 Oop Maps 的数据结构来管理 VM 中的所有 OOP。我的问题是这个 Oop Map 数据结构是什么时候生成的?在编译时还是运行时?任何关于此的进一步详细文件将非常受欢迎。谢谢你们。
最佳答案
OopMap 是一种结构,用于记录对象引用 (OOP) 在 Java 堆栈中的位置。它的主要目的是在 Java 堆栈上找到 GC 根,并在堆内移动对象时更新引用。
OopMap分为三种:
- 解释方法 的 OopMaps。它们是延迟计算的,即当 GC 发生时,通过分析字节码流。最好的引用是源代码(有很多注释),请参阅 generateOopMap.cpp . InterpreterOopMaps 存储在 OopMapCache 中.
- JIT 编译方法 的 OopMaps。它们在 JIT 编译期间生成并与编译后的代码一起保存,以便 VM 可以通过指令地址快速找到堆栈位置和保存对象引用的寄存器。
- 用于生成共享运行时 stub 的 OopMap。这些映射由开发人员(这些运行时 stub 的作者)手动构建。
在 GC 期间,JVM 遍历所有线程堆栈。每个堆栈都被解析为堆栈帧流。这些帧要么是解释的,要么是编译的,要么是 stub 。解释的帧包含有关 Java 方法和 bci(字节码索引)的信息。 OopMapCache 帮助找到与给定方法和 bci 对应的 OopMap。编译帧的方法是通过指令地址查找发现的。
关于java - Oop Maps 在 Hotspot VM 中到底意味着什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26029764/