聊一聊垃圾回收?

C/C++语言中的垃圾回收

1、在C/C++语言中的没有自动的垃圾回收机制,是通过new关键字申请内存资源,通过delete关键字释放内存资源。

2、如果程序员在某些位置没有写delete关键字释放,那么申请的对象会一直占用内存资源,最终可能会导致内存溢出。

Java语言中的垃圾回收

1、Java语言中有自动的垃圾回收机制,也就是我们熟悉的GC

2、GC的精髓在于算法,如果算法不合理一样会内存泄露

垃圾回收的常见算法

1、引用计数法

原理:假设有一个对象A,任何一个对象对A的引用,那么对象A的引用计数器+1,当引用失败时,对象A的引用计数器就-1,如果对象A的计数器的值为0,就说明对象A没有引用了,可以被回收

优点:

1、实时性高,无需等到内存不够的时候,才开始回收,运行时根据对象的计数器是否为0,就可以直接回收

2、在垃圾回收过程中,应用无需挂起。如果申请内存时,内存不够,则立刻报outofmemory错误

3、区域性,更新对象的计数器时,只是影响到该对象,不会扫描全部对象

缺点:

1、每次对象被引用时,都需要去更新计数器,有一点时间开销

2、浪费CPU资源,即使内存够用,仍然在运行时进行计数器的统计

3、无法解决循环引用问题。(最大的缺点)

2、标记清除法

标记清除算法是将垃圾回收分为2个阶段,分别是标记和清除

标记:从根节点开始标记引用的对象

清除:未被标记引用的对象就是垃圾对象,可以被清理

优点:

1、标记清除算法解决了引用计数算法中的循环引用的问题,没有从root节点引用的对象都会被回收

缺点:

1、效率太低,标记和清除两个动作都需要遍历所有的对象,并且在GC时,需要停止应用程序,对于交互性要求比较高的应用而言这个体验是非常差的

2、通过标记清楚算法清理出来的内存,碎片化比较严重,因为被回收的对象可能存在于内存的各个角落,所以清理出来的内存是不连贯的

3、标记压缩算法

基于标记清除算法,将可用的分散的碎片进行整合,不过缺点可能是需要耗时,所以会造成一定的CPU消耗

4、复制算法

JVM中年轻代内存空间

原理:

将所在的内存空间一分为二,每次只用其中的一块。在垃圾回收当中,把正在使用的资源复制到另外一块内存资源中,清空该内存,把两块内存的角色互换从而完成垃圾的回收

当然了,如果内存中对象较少,则复制的对象就少,效率就高,反之就低

5、分代算法

原理:

根据回收对象的特点进行选择,在jvm中,年轻代适合使用复制算法,老年代适合使用标记清除或标记压缩算法

垃圾收集器种类

1、Serial   串行垃圾回收器,当应用程序内存中需要进行垃圾回收的时候,只会有一个GC线程会中断当前应用的线程,必须等到GC线程把垃圾回收以后才能继续执行应用

2、Parallel 并行垃圾回收器,当应用程序内存中需要进行垃圾回收的时候,会出现多个GC线程会中断当前应用的线程,必须等到GC线程把垃圾回收以后才能继续执行应用

3、CMS  和应用线程并发执行,不过在执行垃圾回收的首末还是会有一小段GC线程串行执行的过程,只不过消耗的时间比以上两种时间更短,不易被用户所发觉。但是90%以上都是应用线程和GC线程并行运行的,在G1出现事前都是用的CMS

4、G1 目前最好用的垃圾回收器,G1是一个分代的,增量的,并行与并发的标记-复制垃圾回收器

JDK8默认使用的是并行垃圾回收器

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容