![]() |
1
-3
堆栈可以包含指向堆和常量池的指针(顺便说一句,根据JVM规范,这也是在堆中的逻辑)。特定于实现的这些指针可以指向对象或指向对象的指针。 垃圾收集器的实现可能会影响这种行为。例如,Shenandoah Gc使用额外的指针来访问对象(*)。在这个实现中,堆栈中的一个指针(gc根)指向指向实际对象的另一个指针。Oracle Jvm不是这样实现的。 (*)实施细节; 垃圾收集期间,堆中的对象可以移动到不同的内存位置。例如,伊甸园空间中的对象可以移动到幸存者空间,然后移动到老一代。 有了这些信息,假设一个对象由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 |
![]() |
Brixton Weiss · 在方法内部创建的实例 6 年前 |
![]() |
Henry Marshall · 通过引用替换JS对象[重构工作代码] 7 年前 |
![]() |
NNguyen · C++采访关于返回int*值的范围问题 7 年前 |
![]() |
cesarknbv · 已分配内存在堆栈或堆中 7 年前 |