zoukankan      html  css  js  c++  java
  • jvm的垃圾回收

    参考:https://www.cnblogs.com/xiaoxi/p/6486852.html

    1.如何判断对象已死

      即不在被任何途径引用的对象

    a.引用计数法

       每当有一个地方引用该对象时,则计数器加1,否则减1,当为-1时则表示对象已死,但是Java语言中没有用到这个算法,可以用对象的相互引用来证明

     /**
     * 虚拟机参数:-verbose:gc
     */
    public class ReferenceCountingGC
    {
        private Object instance = null;
        private static final int _1MB = 1024 * 1024;
        
        /** 这个成员属性唯一的作用就是占用一点内存 */
        private byte[] bigSize = new byte[2 * _1MB];
        
        public static void main(String[] args)
        {
            ReferenceCountingGC objectA = new ReferenceCountingGC();
            ReferenceCountingGC objectB = new ReferenceCountingGC();
            objectA.instance = objectB;
            objectB.instance = objectA;
            objectA = null;
            objectB = null;
            
            System.gc();
        }
    }

    b.根收索

    以GC root为收索起点,当一个对象没有引用链时则表明对象不可用

    回收过程:当对象没有引用链的时候,则会被进行第一标记和筛选(条件是没有覆盖finaliza或者该方法已被虚拟机调用过),如果判定要执行finaliza方法,会把其放到队列,然后由虚拟机自动去执行,

    如何finaliza中没有成功的拯救,那么它被再次标记,表明即将回收。

    3.回收算法

      a.标记回收算法:标记需要回收的对象,标记结束回收对象。效率不高且带来大量的碎片空间

      b.复制算法:把内存两块,使用其中一块来开销,当回收时,把未被回收的分配到另一块中。现代的分带回收中的新生带使用这种方法

      c.标记整理算法:前面与标记回收算法一样,但是后面不是是把所有的往一端移动。老年代使用这种算法

    4.分带收集

      

     

  • 相关阅读:
    【MySQL】DBA必备的10款最佳MySQL GUI工具
    【MySQL】获取MySQL崩溃时的core file
    字符串经常用的
    centos 系统上如何把python升级为3
    centos6 升级安装openssh7
    多进程
    队列
    线程池,锁,事件
    thread
    进程、线程
  • 原文地址:https://www.cnblogs.com/lvcongblog/p/10261458.html
Copyright © 2011-2022 走看看