这句话让我有点糊涂:“系统类似于有个引用维护表(像可达性算法分析里提到的4种gc root和reference chain)”。我知道gc roots是一些对象,可达性算法以它们为起点来计算对象之间的引用关系,所以我就以为你说的引用维护表是用来保存对象之间的引用关系。 看你最新的回复,引用维护表其实是保存引用和对象的映射关系。
[quote=引用 10 楼 yuxm909 的回复:] 我又看了遍回复,是不是我的理解有误,感觉老哥你在说的是对象之间的引用关系(gc时jvm需要知道这些),我想了解的是A a = new A(); new出来的类A的对象在gc后地址发生变动,引用变量a的值是不是也会跟着改变,具体是在什么时候谁将它改变的。
我又看了遍回复,是不是我的理解有误,感觉老哥你在说的是对象之间的引用关系(gc时jvm需要知道这些),我想了解的是A a = new A(); new出来的类A的对象在gc后地址发生变动,引用变量a的值是不是也会跟着改变,具体是在什么时候谁将它改变的。
[quote=引用 9 楼 oh_Maxy 的回复:] 简单理解如下: GC做完内存清理后,会有很多空间不连续的碎片。 为了将小碎片连在一起,可能会对存活对象做位移操作的。
简单理解如下: GC做完内存清理后,会有很多空间不连续的碎片。 为了将小碎片连在一起,可能会对存活对象做位移操作的。
[quote=引用 3 楼 yuxm909 的回复:] 按我的理解,复制和标记整理都是会移动对象的,那么地址也就会发生改变吧,不太明白老哥为啥让我再理解下算法,请指点一哈。
感谢指点,大概明白了引用修正。但是链接里就提了一句“Mark-Compact 可能要先计算一次对象的目标地址,然后修正指针,然后再移动对象”,没其它细节了。
按我的理解,复制和标记整理都是会移动对象的,那么地址也就会发生改变吧,不太明白老哥为啥让我再理解下算法,请指点一哈。
对象在执行gc之后,内存地址当然是是可能会改变的,改变了之后原来的引用依然会指向新的地址(否则就乱套了)。所以对于java程序层面来说,考虑这个问题其实没啥意义,这是虚拟机该去考虑的问题。
你可以参考以下文章,java的内存模型以及垃圾回收原理,好好理解新生代老年代的算法 https://www.cnblogs.com/yueshutong/p/9768298.html
62,614
社区成员
307,327
社区内容
加载中
试试用AI创作助手写篇文章吧