垃圾回收算法——复制算法
2023-05-10 22:33:32 0 举报
垃圾回收算法——复制算法
作者其他创作
大纲/内容
H
栈A
效率低,因为需要在不同的内存空间内处理,在搬家的同时也会对引用进行修正还有可能程序只有少量的垃圾或者没有垃圾的情况下,复制式回收期仍然复制出另外一块内存区域,这很浪费;
C
minor gc:当回收时,Eden区和survivor区中的一块会参与,将Eden区和survivor参与的内存中的存货对象复制到另外一块survivor区,当然Hotspot中默认Eden和survivor的比例是8:1,也就是每次新生代中的可用内存占新生代的90%(80+10),只有10%被浪费,当然我们也无法保证每次回收都是不多于10%的对象,所以当survivor区域内存不够时就要其他区域(老年代)进行分配担保(Handle promotion)
GC 回收
E
0x9u...
young
栈B
资源空间的浪费,需要两个堆空间
to
清除前
未使用区域
0Xf2...
0xt5...
0x2...
过程:复制算法大致上是这样玩的,把内存分成两块,每次只使用其中的一块,然后把正在使用的这块内存里面的存活对象复制到不使用的内存里面去,然后再清理掉正在使用的这块内存里面的所有对象,接着交换两块内存的角色,等待下一次回收
新
使用场景:对象存活率较低的场景
主要针对新生代内存区域
清除后
堆B
from
0xu7...
旧
W
A
停止-复制算法(stop-and-copy)
停止-复制工作机制:先暂停程序的运行,从栈或者静态存储区域触发遍历所有的引用,找出所有的存活的对象,进而将它们从当前堆复制到另一个堆,没有复制的就是垃圾,复制的对象到新堆时,它们是一个挨着一个的,然后直接的分配新空间,当然所有的引用都必须修正。
D
当to区满了会复制到from区
0xh2...
堆 A
不需要被回收的对象
缺点:
内存块A
内存块B
old
复制算法执行区域
Q
G
0xi8...
垃圾
0xi2...
Eden
0 条评论
下一页