Java之引用类型分析(SoftReference/WeakReference/PhantomReference)

原创 2017年07月28日 14:24:28

引言: 即使对于Java的很多老鸟来说,如果忽然问他引用的类型,大概率是一脸茫然,不知所措的….Java中的引用还分类型,神马情况??? 本文将针对这些类型进行分析,帮助您一文知所有类型。

Java的类型

在Java中存在的类型有两大阵营: 基本数据类型和Java Class。

  • 所谓的基本数据类型包括: byte, char, int, float, double, long, boolean。
  • 数组是一个特殊的数据结构,其中可以使用基础数据类型,也可以是各种类。
  • 除了基本数据类型之外,就是以Java类存在的各类数据结构,比如JDK中提供的HashMap以及用户自己定义的各种类。

    除了这些语法上的不同之外,从JMM内存结构的存储方式来讲, 基本数据类型存储的就是他们实际的值。 而对于数组、对象,开发者通常访问到的其实只是对象的引用,即对象或者数据实际位置的地址而已;要访问到它的实际内容,需要进行二次寻址,才可以。
    下面以一个简单的测试代码来展示这个特性:

public class TestObjAddr {
    public static void main(String[] args) {
        int addr = 11;

        Object obj = new Object();

        System.out.println("Info:" + addr + "=>" + obj);
        System.out.println("end of the code");
    }
}

运行中的截图:
这里写图片描述

Java的引用类型

引用的类型分为:StrongReference, SoftReference, WeakReference, PhantomReference.

StrongReference是我们常见的对象引用,只要有其他对象对它有引用,则不会被gc回收。
SoftReference:软引用, 当jvm发现某个对象是SoftReference并不会立刻回收,而是按照正常的流程向操作系统申请内存,当系统内存消耗完毕之后,则会针对SoftReference的对象回收内存,但是具体的回收时间点不确定,依据具体的情况而定。

Object referent = new Object();
SoftReference softRerference = new SoftReference(referent);

WeakReference: 弱引用,当某对象被jvm发现是weak reference, 则将其放入待回收队列,等下一次GC启动之时,回收内存。

Object reference = new Object();
WeakReference weakRerference = new WeakReference(reference);

伴随着WeakReference还有一个WeakHashMap,专门用来存放可能被回收的内存对象。

PhantomReferene,幽灵引用,其get方法返回的一直是null, 主要的用处是用来跟踪reference回收的过程。 请注意构造 PhantomReference 时的第二个参数 ReferenceQueue(事实上 WeakReference & SoftReference 也可以有这个参数),
PhantomReference 唯一的用处就是跟踪 reference何时被 enqueue 到 ReferenceQueue 中.

Object referent = new Object();
PhantomReference phantomReference = new PhantomReference(referent, new ReferenceQueue());

应用场景

在了解了基本的内容,我们接下来要尝试回答一个问题,在Java语言中提供了Soft/Weak Reference的此类引用,有什么用处?

应用场景: 主要是在使用完毕之后,就可以被回收的某些内存对象,尤其被装在容器类的对象引用。此类对象,只有容器的引用,除此之外是可以被回收的。

下面来举个例子:
在某个系统中,某个同学不小心使用了HashMap来存放用户的查询结果,从开发的角度,简单很容易使用。 但是在系统的使用过程中,随着查询不停进行,HashMap中的数据越来越大,就是类似内存泄露的感觉。 放在HashMap中的数据永远都无法被回收,因为被HashMap存有引用,就这样,直到内存消耗完毕为止。

问题的分析:
1. 使用了HashMap来解决这个缓存问题,本身策略不是问题,问题在于没有超时的设置,所以只能越来越大,直到内存溢出
2. 可以考虑替换为Redis
3. 如果保持使用HashMap, 则可以考虑使用Soft/Weak Reference来封装查询的临时结果,存放到HashMap中。 当需要内存回收之时,即可进行回收,保持程序的正常运转。

至于Weak/Soft之间的区别,上文已经说过,在与GC回收时机的不同,一般可以考虑使用WeakReference>SoftReference.

总结

这里的引用类型只为解决GC回收的问题,减少内存溢出以及容器类型误用的问题。

——————————– 落寂的分割线,终于到底了——————————

深入理解StrongReference,SoftReference, WeakReference和PhantomReference

Java 中一共有 4 种类型的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference (传说中的幽灵引用 呵呵)...
  • zhangcanyan
  • zhangcanyan
  • 2016年07月11日 11:21
  • 2037

java中的4种reference的差别和使用场景(含理论、代码和执行结果)

我们知道java语言提供了4种引用类型:强引用、软引用(SoftReference)、弱引用(WeakReference)和幽灵引用(PhantomReference),与引用密切相关的,还有一个引用...
  • aitangyong
  • aitangyong
  • 2014年09月21日 18:31
  • 4837

(源码)详细分析Android中的引用机制Reference(WeakReference、SoftReference、PhantomReference)

1、前言 在java中,我们知道一般情况下当一个对象被其他对象引用时,该对象则不会被回收。但是有时我们虽然需要使用该对象,但又希望不影响回收。 比如在Activity中以内部类的方式创建了一个Hand...
  • chzphoenix
  • chzphoenix
  • 2017年11月28日 19:35
  • 485

Java的StrongReference, SoftReference, WeakReference, PhantomReference的区别

Java一共有四种类型的饮用,StrongReference, SoftReference, WeakReference, PhantomReference。这四种类型的引用与GC有着密切的联系。 ...
  • hongchangfirst
  • hongchangfirst
  • 2016年02月25日 11:38
  • 690

java中虚引用PhantomReference与弱引用WeakReference(软引用SoftReference)的差别

本文主要是重申下这几种引用的差别,并给出实际的例子,让读者清楚的感受到它们的差别。软引用和弱引用差别不大,JVM都是先将其referent字段设置成null,之后将软引用或弱引用,加入到关联的引用队列...
  • aitangyong
  • aitangyong
  • 2014年11月21日 21:57
  • 1425

WeakReference与SoftReference的区别

WeakReference与SoftReference都可以用来保存对象的实例引用,这两个类与垃圾回收有关。 WeakReference是弱引用,其中保存的对象实例可以被GC回收掉。这个类通常用...
  • daizheng521
  • daizheng521
  • 2014年10月25日 22:15
  • 601

java 引用类型 WeakReference SoftReference 分析

转:java WeakReference SoftReference and PhatomRefer    1、WeakReference:在垃圾回收器线程扫描它所管辖的内存区域过程中,一旦发现有...
  • liuxianbing119
  • liuxianbing119
  • 2011年09月17日 19:39
  • 705

StrongReference,SoftReference,WeakReference,PhantomReference

1.对象的强、软、弱和虚引用    在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachable)状态,程序才能使用它。从...
  • lyq19870515
  • lyq19870515
  • 2012年10月29日 17:10
  • 419

WeakReference,SoftReference,HardReference,PhantomReference

很多时候我们需要考虑Android平台上的内存管理问题,Dalvik VM给每个进程都分配了一定量的可用堆内存,当我们处理一些耗费资源的操作时可能会产生OOM错误(OutOfMemoryError)这...
  • ainibaifenbai
  • ainibaifenbai
  • 2011年09月19日 11:01
  • 461

StrongReference、SoftReference、WeakReference、PhantomReference

本文介绍对象的强、软、弱和虚引用的概念、应用及其在UML中的表示。 1.对象的强、软、弱和虚引用    在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就...
  • johnjobs
  • johnjobs
  • 2015年06月09日 09:43
  • 231
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java之引用类型分析(SoftReference/WeakReference/PhantomReference)
举报原因:
原因补充:

(最多只允许输入30个字)