java有垃圾回收机器负责回收无用对象占用的内存资源,但是java 里的对象并非总是被垃圾回收。换句话说
1.对象可能不被垃圾回收;
2.垃圾回收并不等于“析构”;
3.垃圾回收至于内存有关;
垃圾回收器工作时,将一面回收空间,一面使用堆中的对象紧凑排列,这样“堆指针”就可以很容易的移动到更靠近起始处,,也就尽量避免了页面错误。通过垃圾回收器对对象的重新排列,实现了一种告诉的,有无限空间可供分配的堆模型。
很多时候人们认为java虚拟机的垃圾回收器使用的是“引用计数技术”,其实不然,这种技术似乎被应用到任何一种java 虚拟机上。
java 虚拟机采用一中自是一个垃圾回收技术,即:
1.停止-复制(stop - and - copy)
2.标记-清扫(mark - and - sweep)
一、停止-复制(stop - and - copy)
先暂停程序运行(所以他不属于后台回收模式),然后将所有“存活”的对对象从当前的堆里拷贝到另一个堆里,没有被复制的全部是垃圾。在新的堆里保持紧凑排列。缺点就是需要维护比实际需要多一倍的空间,当程序稳定时,并没有很多垃圾产生,所以这种方式造成资源的浪费。
存活:对于“活”的对象,一定可以追溯到引用他的堆栈或者静态存储区。
二、标记-清扫(mark - and - sweep)
从堆栈和静态存储区出发,遍历所有引用,进而找出所有“存活”的对象,并给“存活”的对象打上标记,当标记工作完成时,所有未被标记的对象将被清除,缺点是得到的空间并不连续,给后续使用造成困难。
java虚拟机的垃圾回收器是按照这两种方式,进行自适应处理的。当有大量垃圾产生时,stopandcopy,少量垃圾时,使用markandsweep。
现在内存分配是以较大的“块”为单位,有了“块”之后,每个“块”都用相应的代数(generation count)来记录他是否还存活,通常,如果被引用,代数将增加,java 虚拟机将对每个“块”的代数进行监测,根据代数选择使用的清理的策略。
所以这种自适应的回收技术有个啰嗦的名字-----自适应的,分代的,停止-复制,标记-清扫式垃圾回收器。