Java中的垃圾回收算法
2016-04-10 22:30
429 查看
Java中的垃圾回收算法
1. 引用计数算法(Reference Counting Collector)引用计数原理:
- 在堆中,对每个对象都有个引用计数器,被引用时,计数器+1;
- 当引用被置空或离开作用域,引用计数器-1。
无法解决互相引用问题,所以JVM没有采用。同时效率低下
2. 追踪回收算法(Tracing Collector)
原理:
- 利用JVM维护的对象引用图,从根节点遍历对象的引用图,同时标记遍历到的对象。
- 当遍历结束后,未被标记的对象就是不再被使用的对象,可以回收。
3. 压缩回收算法(Compacting Collector)
原理:
- 将堆中活动的对象“移动”到堆中一端,这样会在堆中另外一端留出大的空闲区域。相当于对堆中的碎片进行处理。
该方法可以简化消除堆碎片的工作,但每次处理会带来性能损失。
4. 复制回收算法(Coping Collector)
原理:
- 把堆分成两个大小相同的区域,任何时候,仅有其中之一被使用,直到这个区域被消耗完为止。
- 此时,GC会中断程序的执行,使用遍历的方式将活动对象复制到另一区域中,复制过程中,紧挨着布置,消除了内存碎片。当复制结束后,程序会继续运行,知道此区域被使用完,然后使用同样方式进行垃圾回收。
优点: 垃圾回收的同时,对对象的不知进行了安排,消除了内存碎片
缺点:需要较高的内存空间的代价;同时由于在内存调整的过程中要中断当前执行的程序,会降低程序的执行效率。
5. 按代回收算法(Generational Collector)
原因:
复制回收算法效率低,每次处于活动状态的对象需要被复制
程序的特点:
程序创建的大部分对象的生命周期很短,只有部分对象才有较长生命周期
原理:
- 把堆分成两个或多个子堆,每个子堆视为一代。算法在收集过程中优先收集“年幼”的对象,如果一个对象多次收集仍然“存活”,那么就可以将对象转移到更高级的堆里,减少扫描次数。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树