Java的四种引用源代码例子

Java的四种引用源代码例子

不解释,直接上代码,千言万语顶不住一行代码。

package com.apkkids.javalanguage;

import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.lang.reflect.Field;

/**
 * @author wxb
 * Java的四种引用
 * 强引用:拥有强引用的对象无论何时都不会被垃圾回收
 * 软引用:只拥有软引用的对象当内存不足时,会被垃圾回收
 * 弱引用:只拥有弱引用的对象会在垃圾收集运行时被回收
 * 虚引用:只拥有虚引用的对象和没有引用一样,只不过它被垃圾回收时会被放入关联的引用队列,并可被观察到
 *
 */
public class FourReferenceTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        //三个测试,测试其中一个时请注释掉其他两个
        PhatomReferenceTest();
//      WeakReferenceTest();
//      SoftReferenceTest();
    }

    static void PhatomReferenceTest(){
        String s = new String("abc");
        //创建一个引用队列rq,然后用rq和s一起创建一个虚引用
        final ReferenceQueue<String> rq = new ReferenceQueue<String>();
        PhantomReference<String> wr = new PhantomReference<String>(s,rq);  //wr.get()会永远返回null
        s = null;
        //创建一个线程来循环检测s是否加入了队列
        new Thread(){
            boolean bFlag = true;
            @Override
            public void run() {
                Object obj = null;

                while(bFlag){
                    obj = rq.poll();  //rq中终会poll出一个PhantomReference
                    if(obj != null){
                        bFlag = false;
                        try {
                            //使用反射的原因是PhantomReference的get方法始终返回null
                            //即使向上转型为Reference也不行,因此只能通过反射直接得到存储在Reference类中的referent
                            Field f = Reference.class.getDeclaredField("referent");
                            f.setAccessible(true);
                            String s = (String) f.get(obj);
                            System.out.println("get String from PhantomReference :"+s);
                        } catch (NoSuchFieldException e) {
                            e.printStackTrace();
                        } catch (SecurityException e) {
                            e.printStackTrace();
                        } catch (IllegalArgumentException e) {
                            e.printStackTrace();
                        } catch (IllegalAccessException e) {
                            e.printStackTrace();
                        }

                    }
                }
            }
        }.start();

        try {
            //主线程休眠后运行gc,等待子线程运行
            Thread.sleep(1000);
            System.gc();
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    static void WeakReferenceTest(){
        String s = new String("abc");
        WeakReference<String> wr = new WeakReference<String>(s);
        s = null;
        while(wr.get() != null){
            System.out.println("WeakReference get :"+wr.get());
            System.gc();
            System.out.println("System.gc()");
        }

    }

    /**
     * 不到内存耗尽该测试不会退出
     */
    static void SoftReferenceTest(){
        String s = new String("abc");
        SoftReference<String> wr = new SoftReference<String>(s);
        s = null;
        while(wr.get() != null){
            System.out.println("SoftReference get :"+wr.get());
            System.gc();
            System.out.println("System.gc()");
        }
    }

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-31 14:25:52

Java的四种引用源代码例子的相关文章

Java虚拟机(五)Java的四种引用级别

1.前言 HotSpot采取了可达性分析算法用来判断对象是否被能被GC,无论是引用计算法还是可达性分析算法都是判断对象是否存在引用来判断对象是否存活.如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用.为了丰富的描述对象与对象之间的关系,更为了实现系统缓存的原因,Java建立了四种引用级别. 2.四种引用级别 在JDK1.2后,Java对引用的概念进行了扩充,将引用分为强引用.软引用.弱引用和虚引用4种,这4种引用强度依次减弱. 最后,下面通过

Java的四种引用方式

java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象. java对象的引用包括  强引用,软引用,弱引用,虚引用 Java中提供这四种引用类型主要有两个目的: 第一是可以让程序员通过代码的方式决定某些对象的生命周期: 第二是有利于JVM进行垃圾回收. 下面来阐述一下这四种类型引用的概念: 1.强引用 是指创建一个对象并把这个对象赋给一个引用变量. 比如: Object object =new Object(); String str ="he

【转载】Java的四种引用

在Java中,虽然不需要程序员手动去管理对象的生命周期,但是如果希望某些对象具备一定的生命周期的话(比如内存不足时JVM就会自动回收某些对象从而避免OutOfMemory的错误)就需要用到软引用和弱引用了. 从Java SE2开始,就提供了四种类型的引用:强引用.软引用.弱引用和虚引用.Java中提供这四种引用类型主要有两个目的:第一是可以让程序员通过代码的方式决定某些对象的生命周期:第二是有利于JVM进行垃圾回收.下面来阐述一下这四种类型引用的概念: 1.强引用(StrongReference

转载:Java的四种引用方式

原文:https://www.cnblogs.com/huajiezh/p/5835618.html Java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象. java对象的引用包括  强引用,软引用,弱引用,虚引用 Java中提供这四种引用类型主要有两个目的: 第一是可以让程序员通过代码的方式决定某些对象的生命周期: 第二是有利于JVM进行垃圾回收. 下面来阐述一下这四种类型引用的概念: 1.强引用 是指创建一个对象并把这个对象赋给一个引用变

Java的四种引用,强弱软虚,用到的场景

众所周知,java中是JVM负责内存的分配和回收,这是它的优点(使用方便,程序不用再像使用c那样操心内存),但同时也是它的缺点(不够灵活).为了解决内存操作不灵活这个问题,可以采用软引用等方法. 在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及状态,程序才能使用它.这 就像在日常生活中,从商店购买了某样物品后,如果有用,就一直保留它,否则就把它扔到垃圾箱,由清洁工人收走.一般说来,如果物品已经被扔到垃圾箱,想再 把它捡回来使用就不

Java中四种引用

从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 1.强引用 本章前文介绍的引用实际上都是强引用,这是使用最普遍的引用.如果一个对象具有强引用,那就 类似于必不可少的生活用品,垃圾回收器绝不会回收它.当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题. 2.软引用(SoftReference) 如果一个

java的四种引用,强弱软虚和jvm优化

1.强引用(StrongReference)强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.如下: Object o=new Object();   //  强引用 当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题.如果不使用时,要通过如下方式来弱化引用,如下: o=null;     // 帮助垃圾收集器回收此对象 显式地设置o为null,或超出对象的生命周期范围,则gc

Java的四种引用

1.强引用(StrongReference)强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题.  ps:强引用其实也就是我们平时A a = new A()这个意思. 2.软引用(SoftReference)如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它:如果内存空间不足了,就会回收这些对象的内存.只要垃圾回收

java对象四种引用原理

I.java对象引用的介绍 jdk1.2之前,当对象没有指向它的引用的时候,这个对象就会被gc回收,但有时候我们需要拿回来使用,又没有了其引用,只能重新构建一个对象,若优化的话就做HashMap去缓存到内存,但若对象构建消耗的代价高或者数量比较多的时候,内存就oom.jdk1.2后,java把对象的引用分为了4种级别,使得程序能够灵活的控制对象的生命周期: 1)强引用.强引用是最普遍的,当一个对象有强引用的的时候,其不会被gc回收,不管内存足够还是不足够. 2)软引用.SoftReference