GC机制简介

在这里插入图片描述一、什么是GC:
每个程序员都遇到过内存溢出的情况,程序运行时,内存空间是有限的,那么如何及时的把不再使用的对象清除将内存释放出来,这就是GC要做的事。理解GC机制就从:“GC的区域在哪里”,“GC的对象是什么”,“GC的时机是什么”,“GC做了哪些事”几方面来分析。 1、需要GC的内存区域jvm 中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,我们的内存垃圾回收主要集中于 java 堆和方法区中,在程序运行期间,这部分内存的分配和使用都是动态的。 2、GC的对象需要进行回收的对象就是已经没有存活的对象,判断一个对象是否存活常用的有两种办法:引用计数和可达分析。(1)引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。(2)可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。不可达对象。在Java语言中,GC Roots包括:虚拟机栈中引用的对象。方法区中类静态属性实体引用的对象。方法区中常量引用的对象。本地方法栈中JNI引用的对象。 3、什么时候触发GC(1)程序调用System.gc时可以触发(2)系统自身来决定GC触发的时机(根据Eden区和From Space区的内存大小来决定。当内存大小不足时,则会启动GC线程并停止应用线程)GC又分为 minor GC 和 Full GC (也称为 Major GC )Minor GC触发条件:当Eden区满时,触发Minor GC。Full GC触发条件: a.调用System.gc时,系统建议执行Full GC,但是不必然执行 b.老年代空间不足 c.方法去空间不足 d.通过Minor GC后进入老年代的平均大小大于老年代的可用内存 e.由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小 4、GC做了什么事 主要做了清理对象,整理内存的工作。Java堆分为新生代和老年代,采用了不同的回收方式。(回收方式即回收算法详见后文) 二、GC常用算法GC常用算法有:标记-清除算法,标记-压缩算法,复制算法,分代收集算法。目前主流的JVM(HotSpot)采用的是分代收集算法。 1、标记-清除算法为每个对象存储一个标记位,记录对象的状态(活着或是死亡)。分为两个阶段,一个是标记阶段,这个阶段内,为每个对象更新标记位,检查对象是否死亡;第二个阶段是清除阶段,该阶段对死亡的对象进行清除,执行 GC 操作。优点最大的优点是,标记—清除算法中每个活着的对象的引用只需要找到一个即可,找到一个就可以判断它为活的。此外,更重要的是,这个算法并不移动对象的位置。缺点它的缺点就是效率比较低(递归与全堆对象遍历)。每个活着的对象都要在标记阶段遍历一遍;所有对象都要在清除阶段扫描一遍,因此算法复杂度较高。没有移动对象,导致可能出现很多碎片空间无法利用的情况。图例 2、标记-压缩算法(标记-整理)标记-压缩法是标记-清除法的一个改进版。同样,在标记阶段,该算法也将所有对象标记为存活和死亡两种状态;不同的是,在第二个阶段,该算法并没有直接对死亡的对象进行清理,而是将所有存活的对象整理一下,放到另一处空间,然后把剩下的所有对象全部清除。这样就达到了标记-整理的目的。优点该算法不会像标记-清除算法那样产生大量的碎片空间。缺点如果存活的对象过多,整理阶段将会执行较多复制操作,导致算法效率降低。图例 左边是标记阶段,右边是整理之后的状态。可以看到,该算法不会产生大量碎片内存空间。 3、复制算法该算法将内存平均分成两部分,然后每次只使用其中的一部分,当这部分内存满的时候,将内存中所有存活的对象复制到另一个内存中,然后将之前的内存清空,只使用这部分内存,循环下去。注意:这个算法与标记-整理算法的区别在于,该算法不是在同一个区域复制,而是将所有存活的对象复制到另一个区域内。优点实现简单;不产生内存碎片缺点每次运行,总有一半内存是空的,导致可使用的内存空间只有原来的一半。图例

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android的GC(Garbage Collection)机制是一种自动管理内存的方式,它能够在应用程序运行时动态分配和回收内存。Android系统中的GC是基于Java语言内存管理机制实现的,主要包括以下几个方面: 1. 引用计数法:引用计数法是一种简单的垃圾回收机制,当一个对象被引用时,计数器加1,当没有任何引用指向该对象时,计数器减1。如果计数器为0,则该对象被认为是垃圾,可以被回收。但是,由于在循环引用的情况下,计数器的值始终大于0,所以引用计数法并不适用于Android系统。 2. 标记-清除法:标记-清除法是一种比较常见的垃圾回收算法。它的基本思想是从根节点开始,标记所有可以被访问到的对象,然后清除所有未标记的对象。这种算法可以解决循环引用的问题,但是会产生内存碎片。 3. 复制算法:复制算法是一种将内存分为两个区域的垃圾回收算法,每次只使用其中一个区域,当这个区域用完时,将还存活的对象复制到另一个区域,然后清除当前区域中的所有对象。这种算法可以有效地解决内存碎片问题,但是需要两倍的内存空间。 4. 标记-整理法:标记-整理法是一种先标记所有可达对象,然后将所有存活对象移动到内存的一端,然后清除掉移动过程中未被标记的对象的垃圾回收算法。 在Android系统中,GC机制主要由Dalvik虚拟机和ART虚拟机实现。Dalvik虚拟机采用的是标记-清除算法,而ART虚拟机则采用了更加高效的标记-整理算法。无论采用哪种算法,GC机制都可以帮助开发者避免内存泄漏和内存溢出等问题,提高应用程序的稳定性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值