今天在聊天时,一个群友对JVM进行GC后如果整理内存那么会对对象产生怎样的影响产生了疑问,我觉得挺有意思的,就查阅了一下资料在此做一个记录。
首先我们来看下经典《Thinging in Java》提供了怎样的思路:
我们都知道在常用算法中会对内存进行整理的是复制算法(Copying GC)和标记-整理算法(Mark-Compact GC)。首先让我们来康康复制算法。
复制算法(来自《垃圾回收的算法与实践》)
copying(){
$free = $to_start
for(r : $roots)
*r = copy(*r)
swap($from_start, $to_start)
}
$free 是指示分块开头的变量。首先在第 2 行将 $free 设置在 To 空间的开头,然后在第 3 行、第 4 行复制能从根引用的对象。 copy() 函数将作为参数传递的对象 r 复制的同时,也将其子对象进行递归复制。复制结束后返回指针,这里返回的指针指向的是 r 所在的新空间的对象。
最近太忙了。。。。有空了写,内容比较多