首页 > 编程知识 正文

jvm垃圾回收复制算法,jvm的垃圾回收算法

时间:2023-05-05 23:00:41 阅读:190108 作者:2949

[b][align=center][size=large]垃圾回收算法[/size][/align][/b]

[b][size=medium]1.引用计数法[/size][/b]

[b][size=small]1.1思想[/size][/b]

为对象设置引用计数器,每增加一个对变量的引用,引用计数器就会变为1;每减少一个对变量的引用,引用计数器就会变为-1。只有当对象的引用计数器=0时,才会回收对象。

[b][size=small]1.2优缺点[/size][/b]

1 .每次增加或减少变量参照时进行加法和减法操作。 频繁地操作对象会在一定程度上影响系统的性能。

2 .无法处理循环引用情况。

循环引用:假设有两个对象a和b,a引用了b对象,b也引用了a对象。 在这种情况下,两个对象的引用计数器都不是0,但由于存在交叉引用,a和b无法进行垃圾回收,从而导致内存泄漏。

[color=red][b]注意:由于参考计数器算法存在循环引用和性能问题,因此java虚拟机没有使用此算法作为垃圾回收算法。 [/b][/color]

[b][size=medium]2.标记消除法[/size][/b]

[b][size=small]2.1思想[/size][/b]

可访问的对象:通过根对象的引用搜索最终可以访问的对象。

不可访问的对象:在根对象中进行引用搜索,最终未被引用的对象。

[b][size=small]2.2标记阶段[/size][/b]

通过根节点标记从根节点开始的所有可访问对象。 因此,未标记的对象是未引用的垃圾对象。

[b][size=small]2.3清除阶段[/size][/b]

清除所有未标记的对象

[color=red][b]注意:此方法可以解决循环引用问题。 只有两个对象无法到达。 互相参照也没用。 也是被判断为不能到达的对象。 [/b][/color]

[b][size=small]2.4优缺点[/size][/b]

缺点:垃圾回收后可能存在大量磁盘碎片,确切地说是内存碎片。 因为对象占用的地址空间是固定的。

[b][size=small]2.5总结[/size][/b]

[color=red][b]标签移除算法可能出现的最大问题是空间碎片。 [/b][/color]

[b][size=medium]3.算法[/size][/b]

[b][size=medium]3.1思想[/size][/b]

将原始内存空间划分为两个相同的内存空间,每次只使用一个。 垃圾回收时,[b]将正在使用的内存块中的[color=red]生存对象[/color]复制到未使用的内存空间中[/b],然后单击正在使用的内存块中的所有对象

[b][size=medium]3.2应用场景[/size][/b]

系统中的垃圾对象较多,复制算法需要复制的生存对象相对较少。 因此,在真正需要回收垃圾的时候,复制算法很有效率。

[b][size=medium]3.2优势[/size][/b]

存活的对象在垃圾回收过程中一起分配到另一个内存空间,从而确保回收的内存空间中没有碎片。

[b][size=medium]3.3缺点[/size][/b]

复制算法的成本是将系统[b]的存储器区域减半,只使用一半的区域。 另外,如果存储器区域中垃圾对象较少,则[b]的对象复制也需要花费时间[/b],因此单纯的算法也不理想。

[color=red][b]注意:复制算法适用于痴情的花卷世代。 因为在痴情的花卷一代,通常垃圾的对象比生存对象多,算法效果更好[/b][/color]

[b][size=medium]4.标记压缩算法[/size][/b]

[b][size=medium]4.1思想[/size][/b]

与标记清除算法一样,标记压缩算法也首先从根节点开始,并标记所有可访问的对象。 但是,然后,不是简单地清理未标记的对象,而是将所有存活对象压缩到内存空间的边缘,并清理边界外的所有空间。 这样避免碎片的产生的话,不需要2张相同的存储器空间,所以性价比高。

[color=red][b]注意:标签压缩算法适用于旧年代。 在老一辈中,大多数对象都是生存的对象,因此垃圾对象通常比生存的对象少,标签压缩算法的效果更好[/b][/color]。

[b][size=medium]5.分代算法[/size][/b]

[b][size=medium]5.1思想[/size][/b]

根据目标特征划分内存空间,选择合适的垃圾回收算法,提高垃圾回收效率。

痴情的花卷代:保管年轻对象的堆空间。 年轻的对象是刚做好的,或者垃圾回收次数少的对象。 ---复制算法

年代:保管老年人对象的堆空间。 是即使经历了很多次垃圾回收也还活着的对象。 ---标签清除算法/标签压缩算法

[b][size=medium]5.2算法详细信息[/size][/b]

通常,痴情花卷费回收频率较高,但每次回收时间短,旧年回收频率较低,但消耗的时间较多。 为了支持高频率的痴情花卷费回收,虚拟机可能会使用名称

做卡表的数据结构,卡表为一个比特位集合,每一个比特位可以用来表示老年代的某一区域中的所有对象是否持有痴情的花卷代对象的引用,痴情的花卷代GC时,可以不用花大量时间扫描所有老年代对象,来确定每一个对象的引用关系,而可以先扫描卡表,只有当卡表的标记为1时,才需要扫描给定区域的老年代对象,而卡表为0的所在区域的老年代对象,一定不含有痴情的花卷代对象的引用。
[b][size=medium]6.分区算法[/size][/b]
[b][size=medium]6.1思想[/size][/b]
将整个堆空间划分为连续的不同小区间,每一个小区间都独立使用,独立回收。
[b][size=medium]6.2优点[/size][/b]
可以控制一次回收多少个小区间。通常,相同的条件下,堆空间越大,一次GC所需的时间就越长,从而产生的停顿时间就越长。为了更好的控制GC产生的停顿时间,将一块大的内存区域分割成多个小块,根据目标的停顿时间,每次合理的回收若干个小区间,而不是整个堆空间,从而减少一个GC的停顿时间。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。