博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM垃圾回收算法
阅读量:6258 次
发布时间:2019-06-22

本文共 1243 字,大约阅读时间需要 4 分钟。

1、引用计数算法(Reference Counting Collector)

  引用计数算法作为一种简单但是效率低下的算法,其主要原理如下:在堆中对每个对象都有一个引用计数器;当对象被引用时,引用计数器加1;当引用对象被置为空或者离开作用域时,引用计数器减1,由于这种方法无法解决互相引用的问题,因此JVM没有采用这种算法。

2、追踪回收算法(Tracing Collector)

  追踪回收算法利用JVM维护对象的引用图,从根节点开始遍历对象的应用图,同时标记遍历到的对象。当遍历结束后,未被标记到的对象就是目前已不被使用的对象,可以被回收了。

3、压缩回收算法(Compacting Collector)

  压缩回收算法的主要思路如下:把堆中活动的对象移动到堆的一端,这样就会在堆中另外一端留出很大一块空闲区域,相当于对堆中的碎片进行了处理。虽然这种方法可以大大建华消除堆碎片的工作,但是每次处理都会带来性能损失。

4、复制回收算法(Coping Collector)

   复制回收算法的主要思路如下:把堆分成两个大小相同的区域,在任何时刻,只有其中一个区域被使用,直到这个区域被消耗完为止,此时来及回收器会中断程序的执行,通过遍历的方式吧所有活动的对象复制到另一个区域中,在复制的过程中他们是紧挨着布置的,从而可以消除内存碎片。当复制过程结束后程序会接着运行,直到这块区域被使用完,然后再采用上面的方法继续进行垃圾回收。

  这个算法的优点是在进行垃圾回收的同时对对象的布置也进行了安排,从而消除了内存碎片。但是这也付出了很高的代价:对于指定大小的堆来说,需要两倍大小的内存空间;同时在调整的过程中要中断当前程序的执行,从而降低了程序的指向效率。

5、按代回收算法(Generational Collector)

  按代回收算法JVM将堆划分为Young区、Old区和Perm区。Young区又分为Eden区和两个Survivor区,其中所有新创建的对象都在Eden区,当Eden区满后会触发minorGC将Eden区仍存活的对象复制到其中一个Survivor区中,另一个Survivor区中村后的对象也复制到这个Survivor区中,以保证始终有一个Survivor区是空的;Old区存放的是Young区的Survivor满后触发minorGC后仍然存活的对象,当Eden区满后会将对象存放到Survivor区中,如果Survivor区仍然存不下这些对象,GC收集器会将这些对象直接存放到Old区。如果在Survivor区中的对象足够老,也直接存放到Old区。如果Old区也满了,将会触发Full GC,回收整个内存;Perm区存放的主要是类的Class对象,如果一个类被频繁的加载,也可能会导致Perm区满,Perm区的垃圾回收也是由Full GC触发的。

转载于:https://www.cnblogs.com/alternative/p/7799520.html

你可能感兴趣的文章
更换笔记本内存:自己动手修电脑(一)
查看>>
区分扫描枪输入和键盘输入的实现
查看>>
【mongdb主从复制和同步】
查看>>
下载文件downloadFile
查看>>
cf-Round542-Div2-B(贪心)
查看>>
日志挖掘(logminer)
查看>>
LaTeX技巧005:定制自己炫酷的章节样式实例
查看>>
1_NAT模式和桥接模式下的网络配置
查看>>
EF架构~为EF DbContext生成的实体添加注释(T5模板应用)
查看>>
【转】VLAN原理详解
查看>>
python --- json模块和pickle模块详解
查看>>
idea中artifacts、facets、modules是什么意思?
查看>>
FUCKED-BUG之临时对象的生死
查看>>
SP2 PRIME1 - Prime Generator
查看>>
创建和编辑 crontab 文件
查看>>
钉钉发消息
查看>>
20172309_《程序设计与数据结构(下)》_课堂测试修改报告。
查看>>
(二十九)方法调用之解析
查看>>
Springboot文件上传与下载
查看>>
Activity与Fragment数据传递之Fragment从Activity获取数据 分类: ...
查看>>