1.常用垃圾回收机制#
引用计数是一种简单单速度很慢的垃圾回收机制。每个对象含有一个引用计数器,当有引用连接至对象时,引用计数加1。当引用离开作用域或被置空时,引用计数减1。当垃圾回收器在列表中遍历时,发现某个对象的引用计数为0,就释放其占用的空间。例如python中:
num1 = 1
num2 = 1
print id(num1)
print id(num2)
//此时两个值的id相同
上例说明1本身是一个对象,num1和num2都是这个对象的引用,既是指向同一个对象的两个别名。
2.Java虚拟机的垃圾回收机制#
JAVA的GC实现了一种自适应的方式。根据当前情况,如果停止-复制后回收的垃圾很少则切换为标记-清扫方式,反之如果标记-清扫后垃圾很多则切换为停止-复制模式。JAVA垃圾回收并不是随时进行,只有在内存不足时才会执行,因为垃圾回收本身是一项很耗费资源的操作。
2.1停止-复制##
通过在两个堆上来回复制存活对象实现。首先运行的JAVA程序将会被暂停,GC扫描原有堆中的存活对象,拷贝的新堆中,一方面移除了非存活对象,另一方面紧凑了内存中的对象。但是这种方式开销较大,在垃圾对象很少的时候会浪费资源,所以当一次停止-复制之后检测到回收垃圾较少,GC会切换到标记-清扫模式。
2.2标记-清扫##
通过扫描堆上的每个对象,如果已经为存活对象则标记,第二次扫描是清扫非存活对象,但是不做紧凑操作,是一种原地操作。当一次标记-清扫之后发现存在大量垃圾对象则GC将切换到停止-复制模式。