引用和可触及性的长度

 在JAVA中提供了4个级别的引用:强引用,软引用,若引用,虚引用。强引用就是程序中通常使用的引用类型,强引用的对象是可触及的,不会被回收。相对的,软引用,若引用和虚引用的对象是软可触及,弱可触及,虚可触及,在必定条件下均可以被回收的java

一 强引用

// 强引用
StringBuffer str = new StringBuffer("abc");

二 软引用

软引用是比强引用弱一点的引用类型,一个对象只有持有软引用,那么当堆空间不足时,就会被回收。因此软引用不会形成内存溢出。数组

import java.lang.ref.SoftReference;

/**
 * Created by dingshuangkun on 2018/1/26.
 */
public class Main {

    public static class User{
        private String name;
        private Integer age;

        public User(String name, Integer age) {
            this.name = name;
            this.age = age;
        }

        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    public static void main(String[] args){
        User user = new User("dingding",20);
        SoftReference<User> softReference = new SoftReference<>(user);
        user = null;
        System.out.println(softReference.get());
        System.gc();
        System.out.println("--------GC----------");
        System.out.println(softReference.get());

        byte[] b =new byte[1024*1024*10];
        System.gc();
        System.out.println("----------建立byte数组后再次GC----------");
        System.out.println(softReference.get());
        
    }
}

三 若引用

 发现即回收,在系统GC时,只要发现若引用,无论系统堆空间的使用状况如何,都会将对象进行回收。因为垃圾收集器的线程一般优先级很低,所以并不必定能很快的发现持有若引用对象,在这种状况下,若引用对象能够存在较长的时间。一旦一个弱引用对象被垃圾回收器回收,便会加入到一个注册引用队列中。ide

 

import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

/**
 * Created by dingshuangkun on 2018/1/26.
 */
public class Main {

    public static class User{
        private String name;
        private Integer age;

        public User(String name, Integer age) {
            this.name = name;
            this.age = age;
        }

        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    public static void main(String[] args){
        User user = new User("dingding",20);
        WeakReference<User> weakReference = new WeakReference<User>(user);
        user = null;
        System.out.println(weakReference.get());
        System.gc();
        System.out.println("--------GC----------");
        System.out.println(weakReference.get());
        
    }
}

 

运行结果this

User{name='dingding', age=20}
--------GC----------
nullspa

Process finished with exit code 0
 线程

四 虚引用

 随时均可能被回收。下面就不介绍了code

相关文章
相关标签/搜索