java的四大引用对象

总结:
    强引用:StrongRefrence
        例子:Object Obj = new Object()  ;String str = "123"
        用途:任何适合
        特点:1、GC绝对不会回收,超出内存时报OOM(OutOfMemoryError)异常
    弱引用
        例子:Object obj = new Object();
            SoftReference sf = new SoftReference(obj);
        用途:内存高速缓存  eg:网页缓存、图片缓存等。
        特点:内存不足时回收 可以引用队列使用
    软引用
        例子:String str=new String("abc");    
            WeakReference abcWeakRef = new WeakReference(str);    
        用途:不想介入这个对象的生命周期,一般也是在高速缓存中使用
        特点:GC扫描到,无论内存如何,均回收    
    虚引用
        例子: String str=new String("abc");
            ReferenceQueue rq2 = new ReferenceQueue();
            PhantomReference abcWeakRef22 = new PhantomReference(str,rq2);
        用途:跟踪对象的垃圾回收活动
        特点:与对象生命周期无关,任何时候都可能被收回(主要看引用对象的生命周期(eg:str),str被回收,虚引用必被回收)

细节整理:

java内存管理分为内存分配和内存收回,都不需要程序员负责,垃圾回收机制主要看对象是否有引用指向该对象
java对象的引用包括:
    强引用、软引用、弱引用、虚引用
java中提供这四种引用类型的目的:
    1、让程序员通过代码的方式决定某些对象的生命周期
    2、有利于JVM进行垃圾回收
    
强引用:StrongReference
    定义:创建一个对象,并把这个对象赋值给一个引用变量    
    实现案例:eg: Object obj = new Object()
                  String str = "hello";  //等同于  String str = new String("hello")
                  Student stu = new Student()    
                  //以上obj、str、stu就是强引用
    特点:
            1、强引用有引用变量指向时永远不会被垃圾回收,内存不足时,报错outofmemoryError(OOM),也不会回收强引用的
                对象里解决内存不足的问题,
            2、如果不使用,可以通过(eg:obj=null)来弱化引用,帮助GC回收该对象;GC认为该
                对象不存在的引用的两种情况(1、obj=null; 2、超出对象的生命周期)这时候就可以回收该对象,但具体的回收时间
                取决于GC的算法(案例:ArrayList的clear()方法) 
            3、引用保存在栈中(obj,str,stu),真正的引用内容(new Object(),“hello”,new Student())保存在堆中
                
    注意:
            1、强引用并非是GC不回收
            2、方法中的强引用,方法运行结束后,方法内的强引用就没用了,它们指向的对象都会比被JVM回收
软引用:SoftReference
    定义:    SoftReference 类实现软引用。在系统要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行二次回收。
    实现案例:Object obj = new Object();
            SoftReference sf = new SoftReference(obj);
            sf就为软引用
    特点:    
            1、如果一个对象具有软引用,内存足够GC就不会回收它,内存不足时就会回收这些对象的内存,故可以防止内存
                泄露,增强代码的健壮性
            2、软引用用来实现内存敏感的高速缓存,eg:网页缓存、图片缓存等。
            
    注意:    软引用可以和一个引用队列(referenceQueue)联合使用,如果软引用锁所引用的对象被垃圾回收机器回收,
            JVM就会把这个软引用加入到与之关联的引用队列中
    强引用对比:
            1、内存溢出后的处理。
            2、使用场景
            
弱引用:WeakReference
    定义:WeakReference 引用定义的引用
    实现案例:String str=new String("abc");    
            WeakReference abcWeakRef = new WeakReference(str);    
            示例代码:D:\ideaproject\idea-spark-2-25\JVMDemoJDK1.8\src\main\java\referencedemo
    特点:
        1、弱引用比软引用具体更短的生命周期,在垃圾回收期线程扫描到它所管辖的内存区域的过程中,一但发现只具有弱引用的对象,不管
            当前内存空间足够与否,都会回收它的内存。(由于垃圾回收线程是一个优先级很低的线程,所以不一定会很快发现弱引用的对象)
    注意:不想介入这个对象的生命周期时,使用弱引用
    对比:1、比软引用生命周期短
            
        
虚引用:PhantomReference
    定义:顾名思议,形同虚设,与其他引用不同,虚引用并不决定对象的生命周。
    实现案例:
    特点:如果一个对象仅持有虚引用,那么它就和没有引用一样,在任何时候都可以被垃圾回收期收回
    作用:跟踪对象被垃圾回收器回收的活动。
    对比:    1、虚引用和软引用,弱引用的区别在于,必须和引用队列共同使用。
            2、当垃圾回收器回收对象时,发现有虚引用,就会在回收对象的内存之前,把虚引用对象加入到与之关联的引用队列中。
         

你可能感兴趣的:(JVM,JAVA)