JVM Stack 是否没有直接引用对象而是引用常量池?
Does JVM Stack have no direct references to objects but reference to constant pool?
我正在研究 JVM 架构及其幕后工作。
我多次听说堆栈存储方法 return 类型、操作数、局部变量和对对象的引用。
但是在阅读 Oracle 规范时,我发现绘制的堆栈框架的图片没有直接引用对象,而是引用常量池。
我是否正确理解堆栈是否具有对堆中对象的引用的引用?
帧 - 是堆栈的一部分。
Each frame has its own array of local variables (§2.6.1), its own
operand stack (§2.6.2), and a reference to the run-time constant pool
(§2.5.5) of the class of the current method.
从这个解释中我可以理解,为了在堆中获取对象的地址,我们需要在 运行-time 常量池中找到它。
Link 到 Oracle 规范 - https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html
堆栈可以包含指向堆和常量池的指针(顺便说一句,根据 JVM 规范,这在逻辑上也位于堆中)。特定于实现的这些指针可以指向对象或指向对象的指针。
垃圾收集器的实施会影响此行为。例如 Shenandoah Gc 使用额外的指针来访问 objects(*) 。通过此实现,堆栈中的指针(gc root)指向另一个指向实际对象的指针。 Oracle Jvm 不是这样实现的。
(*) 实施细节;
堆中的对象可以在垃圾回收期间移动到不同的内存位置。例如,eden space 中的对象可以移动到 survivor space,然后再移动到老年代。
有了这些信息,假设一个对象由 10 个指针指向,如果这个对象的内存地址发生变化,则应更新 10 个指针以指向正确的地址。如果是指针,则指向一个转发指针,并且那个转发指针指向对象;这次只需要更新转发指针。转发指针方法的目的是减少垃圾收集暂停时间。(以降低吞吐量为代价)
下面的视频中有这个过程的解释。
https://youtu.be/AAiB3fDwyRM?t=424
https://wiki.openjdk.java.net/display/shenandoah/Main
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5.4
我正在研究 JVM 架构及其幕后工作。
我多次听说堆栈存储方法 return 类型、操作数、局部变量和对对象的引用。
但是在阅读 Oracle 规范时,我发现绘制的堆栈框架的图片没有直接引用对象,而是引用常量池。
我是否正确理解堆栈是否具有对堆中对象的引用的引用?
帧 - 是堆栈的一部分。
Each frame has its own array of local variables (§2.6.1), its own operand stack (§2.6.2), and a reference to the run-time constant pool (§2.5.5) of the class of the current method.
从这个解释中我可以理解,为了在堆中获取对象的地址,我们需要在 运行-time 常量池中找到它。
Link 到 Oracle 规范 - https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html
堆栈可以包含指向堆和常量池的指针(顺便说一句,根据 JVM 规范,这在逻辑上也位于堆中)。特定于实现的这些指针可以指向对象或指向对象的指针。
垃圾收集器的实施会影响此行为。例如 Shenandoah Gc 使用额外的指针来访问 objects(*) 。通过此实现,堆栈中的指针(gc root)指向另一个指向实际对象的指针。 Oracle Jvm 不是这样实现的。
(*) 实施细节;
堆中的对象可以在垃圾回收期间移动到不同的内存位置。例如,eden space 中的对象可以移动到 survivor space,然后再移动到老年代。 有了这些信息,假设一个对象由 10 个指针指向,如果这个对象的内存地址发生变化,则应更新 10 个指针以指向正确的地址。如果是指针,则指向一个转发指针,并且那个转发指针指向对象;这次只需要更新转发指针。转发指针方法的目的是减少垃圾收集暂停时间。(以降低吞吐量为代价)
下面的视频中有这个过程的解释。
https://youtu.be/AAiB3fDwyRM?t=424
https://wiki.openjdk.java.net/display/shenandoah/Main https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5.4