java - Oop Maps 在 Hotspot VM 中到底意味着什么

标签 java jvm jvm-hotspot

我从一些文档中了解到,Hotspot VM 使用一种称为 Oop Maps 的数据结构来管理 VM 中的所有 OOP。我的问题是这个 Oop Map 数据结构是什么时候生成的?在编译时还是运行时?任何关于此的进一步详细文件将非常受欢迎。谢谢你们。

最佳答案

OopMap 是一种结构,用于记录对象引用 (OOP) 在 Java 堆栈中的位置。它的主要目的是在 Java 堆栈上找到 GC 根,并在堆内移动对象时更新引用。

OopMap分为三种:

  1. 解释方法 的 OopMaps。它们是延迟计算的,即当 GC 发生时,通过分析字节码流。最好的引用是源代码(有很多注释),请参阅 generateOopMap.cpp . InterpreterOopMaps 存储在 OopMapCache 中.
  2. JIT 编译方法 的 OopMaps。它们在 JIT 编译期间生成并与编译后的代码一起保存,以便 VM 可以通过指令地址快速找到堆栈位置和保存对象引用的寄存器。
  3. 用于生成共享运行时 stub 的 OopMap。这些映射由开发人员(这些运行时 stub 的作者)手动构建。

在 GC 期间,JVM 遍历所有线程堆栈。每个堆栈都被解析为堆栈帧流。这些帧要么是解释的,要么是编译的,要么是 stub 。解释的帧包含有关 Java 方法和 bci(字节码索引)的信息。 OopMapCache 帮助找到与给定方法和 bci 对应的 OopMap。编译帧的方法是通过指令地址查找发现的。

关于java - Oop Maps 在 Hotspot VM 中到底意味着什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26029764/

相关文章:

java - java IO 中的缓冲区如何工作?

java - 使用 JIT 编译器的 Collections.emptyList 和空 ArrayList 的性能

java - 为什么 JNI Activity 实例会阻止 GC?

java - 方法引用可以用来访问静态方法吗?

java - firebase 数据库中子项的值显示为空

java - 我正在尝试更新数据库中的数据,但它不起作用

java - 在大型项目中编译单个java类会影响当前正在运行的应用程序

java - Oracle Java 7 JVM 的默认最大堆大小是如何计算的?

java - 如何在 Windows 上使用 Java Hotspot JVM 禁用小型转储 (mdmp) 文件生成

java - 如何让 hibernate 删除一张 table 而离开另一张 table ?