• JVM学习二(JAVA的四种引用)


    JAVA的四种引用

    1. 强引用 只有所有 GC Roots 对象都不通过【强引用】引用该对象,该对象才能被垃圾回收
    2. 软引用(SoftReference) 仅有软引用引用该对象时,在垃圾回收后,内存仍不足时会再次出发垃圾回收,回收软引用 对象 可以配合引用队列来释放软引用自身
    3. 弱引用(WeakReference) 仅有弱引用引用该对象时,在垃圾回收时,无论内存是否充足,都会回收弱引用对象 可以配合引用队列来释放弱引用自身
    4. 虚引用(PhantomReference) 必须配合引用队列使用,主要配合 ByteBuffer 使用,被引用对象回收时,会将虚引用入队, 由 Reference Handler 线程调用虚引用相关方法释放直接内存
      软引用演示:
    /**
     * 演示软引用 -Xmx20m -XX:+PrintGCDetails -verbose:gc
     */
    public class Demo2_3 {
    
        private static final int _4MB = 4 * 1024 * 1024;
    
    
        public static void main(String[] args) throws IOException {
            /*List<byte[]> list = new ArrayList<>();
            for (int i = 0; i < 5; i++) {
                list.add(new byte[_4MB]);
            }
    
            System.in.read();*/
            soft();
    
    
        }
    
        public static void soft() {
            // list --> SoftReference --> byte[]
    
            List<SoftReference<byte[]>> list = new ArrayList<>();
            for (int i = 0; i < 5; i++) {
                SoftReference<byte[]> ref = new SoftReference<>(new byte[_4MB]);
                System.out.println(ref.get());
                list.add(ref);
                System.out.println(list.size());
    
            }
            System.out.println("循环结束:" + list.size());
            for (SoftReference<byte[]> ref : list) {
                System.out.println(ref.get());
            }
        }
    

    配合队列

    public class Demo2_4 {
        private static final int _4MB = 4 * 1024 * 1024;
    
        public static void main(String[] args) {
            List<SoftReference<byte[]>> list = new ArrayList<>();
    
            // 引用队列
            ReferenceQueue<byte[]> queue = new ReferenceQueue<>();
    
            for (int i = 0; i < 5; i++) {
                // 关联了引用队列, 当软引用所关联的 byte[]被回收时,软引用自己会加入到 queue 中去
                SoftReference<byte[]> ref = new SoftReference<>(new byte[_4MB], queue);
                System.out.println(ref.get());
                list.add(ref);
                System.out.println(list.size());
            }
    
            // 从队列中获取无用的 软引用对象,并移除
            Reference<? extends byte[]> poll = queue.poll();
            while( poll != null) {
                list.remove(poll);
                poll = queue.poll();
            }
    
            System.out.println("===========================");
            for (SoftReference<byte[]> reference : list) {
                System.out.println(reference.get());
            }
    
        }
    }
    

    演示:弱引用

    /**
     * 演示弱引用
     * -Xmx20m -XX:+PrintGCDetails -verbose:gc
     */
    public class Demo2_5 {
        private static final int _4MB = 4 * 1024 * 1024;
    
        public static void main(String[] args) {
            //  list --> WeakReference --> byte[]
            List<WeakReference<byte[]>> list = new ArrayList<>();
            for (int i = 0; i < 10; i++) {
                WeakReference<byte[]> ref = new WeakReference<>(new byte[_4MB]);
                list.add(ref);
                for (WeakReference<byte[]> w : list) {
                    System.out.print(w.get()+" ");
                }
                System.out.println();
    
            }
            System.out.println("循环结束:" + list.size());
        }
    
  • 相关阅读:
    学习、发现和创造一切皆有规律
    Ubuntu12.04下建立交叉编译环境、使用QEMU模拟CortexA9、QEMU运行uboot
    基于ARM的SoC设计入门[zz]
    ARM指令集详解[zz]
    电子工程自学步骤与书籍非电子专业
    IC设计的前端和后端[zz]
    [转]用C#获取IE临时文件
    二行代码解决全部网页木马(含iframe/script木马)(zt)
    winform 分页控件,源码下载
    在UpdatePanel中GridView导出EXECL问题
  • 原文地址:https://www.cnblogs.com/szls-666/p/12494146.html
Copyright © 2020-2023  润新知