标签:
1. java的垃圾回收机制主要工作包括:确定哪些对象属于垃圾,回收无用的对象占用的空间,使堆中的存活对象紧密排列。
2. Java垃圾回收的算法:
引用计数(基本不用):
当引用指向一个对象时,该对象的引用计数器+1;
当引用离开对象挥着被标记为null时,引用计数器-1;
当引用计数器为0时,释放对象占用的空间。
缺陷:如果对象间存在循环引用,可能会发生对象无法被回收的情况。
停止-复制:
对象发现:
从堆栈和静态存储区出发遍历所有引用,找到引用的对象以及该对象包含的所有引用,从而找到所有活着的对象。
处理:
暂停程序运行,将活的对象从一个堆复制到另一个堆;
未被复制的对象属于垃圾,被复制的对象在新的堆上顺序排列;需要修正指向被复制对象的引用;
缺点:
需要更多的空间(两个堆);
对于稳定状态的程序,可能只产生很少的垃圾,这个时候“停止——复制”的比较浪费时间;
标记——清扫:
对象发现:
过程类似“停止复制”,在遍历的过程中为存活的对象设置标记;
处理:
没有标记的对象属于垃圾,进行回收,不进行复制,可能造成内存不连续。
分代垃圾回收机制(根据对象的生命周期进行分区域存放,不同区域采用不同的垃圾回收算法):
年轻的对象放在年轻区域,这个区域的对象会面临频率更高的垃圾回收;
年轻区域的对象经过若干次垃圾回收之后,如果还继续存活,机会被放入年老区,这个区域进行垃圾回收的频率比较低;
当年老区空间不足时,会触发全局垃圾回收。
关于分代回收的资料:http://developer.51cto.com/art/201201/311696.htm
标签:
原文地址:http://www.cnblogs.com/linxiong/p/4328479.html