4.1 jvm 深入学习之 java 引用

37 篇文章 0 订阅

java 引用分几种?

一、Java引用的四种状态:

强引用:

  用的最广。我们平时写代码时,new一个Object存放在堆内存,然后用一个引用指向它,这就是强引用。

  如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。

软引用:

  如果一个对象只具有软引用,则内存空间足够时,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。(备注:如果内存不足,随时有可能被回收。)

  只要垃圾回收器没有回收它,该对象就可以被程序使用。

      软引用可用来实现内存敏感的高速缓存。

弱引用:

  弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期

  每次执行GC的时候,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象

虚引用:

  “虚引用” 顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收

  虚引用主要用来跟踪对象被垃圾回收器回收的活动。

代码实例:


import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by sunzhinan on 16/11/4.
 */
public class ReferenceTest {
    //静态内部类 : 软引用实例。
    public static class SoftReferenceInstance{
        //哈希MAP  value 为弱引用指向的对象。
        private static Map<String, SoftReference> sqlCache = new HashMap<String, SoftReference>();

        private static Object getFromChache(String sql) {
            //从map 里获取 软引用对象实例。
            SoftReference sr = sqlCache.get(sql);
            //赋值给object 对象 判空
            Object object = sr == null ? null : sr.get();
            if (object == null) {
                //从数据库中获取对象
                object = getFromQuery(sql);
                //创建软引用,存入缓存。
                sqlCache.put(sql, new SoftReference(object));
            }
            return object;
        }

        private static Object getFromQuery(String sql) {
            //从数据库查询,速度较慢。
            return null;
        }
    }





    public static void main(String[] args) {
        //创建弱引用对象的方法1。
        SoftReference<String> stringSoftReference=new SoftReference<String>(new String("123"));
        //创建弱引用对象的方法2。
        //String s="123";
       // SoftReference<String> stringSoftReference1=new SoftReference<String>(s);

        //创建弱引用方法
        WeakReference<String> stringWeakReference=new WeakReference<String>(new String("123"));

        //虚引用创建方法
        ReferenceQueue refQueue = new ReferenceQueue();
        PhantomReference<String> phantom = new PhantomReference<String>(new String("123"), refQueue);

       // PhantomReference<String> phantom1 = new PhantomReference<String>(new String("123"), refQueue);

        System.out.println("before------------");
        System.out.println(stringSoftReference.get());
        System.out.println(stringWeakReference.get());
        System.out.println(phantom.get());

        System.gc();

        System.out.println("after--------------");
        System.out.println(stringSoftReference.get());
        System.out.println(stringWeakReference.get());
        System.out.println(phantom.get());

    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值