java垃圾回收机制

来源:互联网 发布:更新多字段sql语句 编辑:程序博客网 时间:2024/06/17 00:32

1、什么是垃圾回收

垃圾回收是JVM线程回收无用的对象占据的内存空间。

2、怎么发现无用对象

 a、 引用计数法 

          使用计数器区分存活对象和无用对象,堆中的每个对象对应一个计数器,创建一个对象赋值给一个变量时,计数器加1,每次对象赋值给变量时,计数器加1,引用失效时,计数器减1 ,当计数器为0,对象为无用对象。

b、根集法

       从根集开始确定可达和不可达对象,不可达对象即为无用对象。

        根集包括 虚拟机栈中引用的对象 、方法区域中的类静态属性引用的对象、方法区域中常量引用的对象、本地方法栈中JNI(Native方法)引用的对象

3、垃圾收集算法

a、引用计数法

     用2.a方法发现无用对象,收集。

      实现简单,不会长时间中断程序,但是每次增加引用和引用失效都伴随着一个加法和减法操作,影响系统性能,而且不能处理循环引用问题。

b、标记清除法

    从根集开始,标记所有从根节点可达的对象,没有标记的对象就是无用对象,然后,清除所有没被标记的无用对象

    产生内存碎片

c、复制算法

   将内存空间分为两块,一次使用一块,垃圾回收时,将正在使用的一块的存活对象复制到另一空闲块,清除正在使用的内存块。

   不会产生内存碎片,在垃圾对象很多的情况下效率比较高

   jvm的新生代串行垃圾回收器中,使用复制算法,老生代存活对象比较多,复制成本比较大,不适合用此方法。

d、标记压缩法

  与标记清除法一样,标记所有从根节点可达的对象,然后将所有存活的对象压缩到内存的一段。

  避免产生内存碎片,同时不需要两块内存块。是一种老生代的回收算法。

e、分代算法

    根据对象特点把内存分成几块,根据每块内存空间存储对象的特点,采用不同的回收算法

    一般情况下,jvm把所有新建对象放入新生代内存区域,由于新手代特点是朝生夕灭,适合复制算法。一个对象经过几次回收依然存活,会放入老生代。老生代对象存活率比较高,适合标记压缩法。

   新生代回收频率高,耗时短,老生代回收频率低,耗时长。

f、分区算法

   把整个堆空间分为连续的小区间,每个区间独立使用,独立回收。根据目标停顿时间,合理回收若干个区间,减少一次GC的停顿


0 0
原创粉丝点击