![]() |
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 |
![]() |
Sam · jvm如何优化循环代码? 6 年前 |
![]() |
pushpavanthar · 纱线中的调谐火花作业 6 年前 |
![]() |
Ashish K · 在Groovy中将字符串参数传递给对象方法参数 6 年前 |
![]() |
St.Antario · 在Java中侦听多个目录以创建文件 6 年前 |
![]() |
Bonsaisteak · 为什么年轻一代需要三个区域来收集垃圾? 6 年前 |