GC后,内存地址变了,对象引用变了吗?

编程

一般对于堆区或静态区的引用,直接修改引用的指向(A->B,直接修改为A->C);
其他的引用,通过修改映射关系来间接改变指向(A->映射关系AB->B,修改为A->旧映射关系AB->新映射关系BC->C)。

为什么有些引用直接修改指向,有些引用修改映射关系?

这应该也是一个性能平衡考虑,就好比新生代用复制算法,老生代用标记整理算法一样,单纯的修改引用指向,如果引用很多,比如多个引用同时指向同一个对象,遍历每个引用效率会很低,而如果只改变映射关系(旧地址到新地址映射),那么改变一个地方,所有的引用就都能同时改变为指向对象新地址,这样效率就大大提高。
 

GcRoot的种类

1.虚拟机栈:栈帧中的本地变量表引用的对象

2.native方法引用的对象

3.方法区中的静态变量和常量引用的对象

以上是 GC后,内存地址变了,对象引用变了吗? 的全部内容, 来源链接: utcz.com/z/514351.html

回到顶部