美文网首页java
java虚拟机的垃圾处理机制

java虚拟机的垃圾处理机制

作者: 谁在烽烟彼岸 | 来源:发表于2017-07-08 17:57 被阅读4次

    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 虚拟机将对每个“块”的代数进行监测,根据代数选择使用的清理的策略。

    所以这种自适应的回收技术有个啰嗦的名字-----自适应的,分代的,停止-复制,标记-清扫式垃圾回收器。

    相关文章

      网友评论

        本文标题:java虚拟机的垃圾处理机制

        本文链接:https://www.haomeiwen.com/subject/fdkjhxtx.html