引言: 即使对于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回收的问题,减少内存溢出以及容器类型误用的问题。

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

Java之引用类型分析(SoftReference/WeakReference/PhantomReference)的更多相关文章

  1. Reference SoftReference WeakReference PhantomReference Cleaner 的研究与实践

    最近在看netty的时候看到直接内存的相关概念,为了更详细的了解一下具体原理,搜到了一篇不错的文章 http://lovestblog.cn/blog/2015/05/12/direct-buffer ...

  2. 4种引用与垃圾回收 :StrongReference, SoftReference, WeakReference , PhantomReference

  3. Java/Android引用类型及其使用分析

    Java/Android中有四种引用类型,分别是: Strong reference     - 强引用Soft Reference        - 软引用Weak Reference      - ...

  4. Java核心技术-高级特性(2)- SoftReference, WeakReference and PhantomReference

    Java.lang.ref 是 Java 类库中比较特殊的一个包,它提供了与 Java 垃圾回收器密切相关的引用类.这些引用类对象可以指向其它对象,但它们不同于一般的引用,因为它们的存在并不防碍 Ja ...

  5. (转)java内存分配分析/栈内存、堆内存

    转自(http://blog.csdn.net/qh_java/article/details/9084091) java内存分配分析/栈内存.堆内存 java内存分配分析 本文将由浅入深详细介绍Ja ...

  6. 性能分析之-- JAVA Thread Dump 分析综述

    性能分析之-- JAVA Thread Dump 分析综述       一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工 ...

  7. Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...

  8. Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析

    原文地址:http://www.javatang.com 一个典型的thread dump文件主要由一下几个部分组成: 上图将JVM上的线程堆栈信息和线程信息做了详细的拆解. 第一部分:Full th ...

  9. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

随机推荐

  1. 配置hadoop集群的lzo压缩

    MR-Job中使用lzop详见MR案例:Job中使用Lzo压缩 1). 配置前的环境准备 # yum -y install lzo-devel zlib-devel gcc autoconf auto ...

  2. [洛谷P4918]信仰收集

    题目背景 随着各种势力的迁入,守矢神社丧失了不少信仰现在,为了挽回香火日益惨淡的神社,八坂神奈子派遣神社的风祝早苗去人类村落收集信仰 题目描述 你可以将村落看成一个m个点的有向无环图(编号从1−m), ...

  3. Kruskal算法初步

    2017-09-18 21:53:00 writer:pprp 代码如下: /* @theme: kruskal @writer:pprp @date:2017/8/19 @begin:21:19 @ ...

  4. POJ2503 STL map用法

    2017-08-21 15:42:01 writer:pprp 除了用到map以外,输入也是一个问题 用到了sscanf详情请看上一篇博客 /* theme:第一章 - 分治算法 name: POJ ...

  5. 01_MapReduce流程总结

    1. MapReduce整体流程 1. 每个map,reduce都作为1个独立进程process启动(多进程并发方式,spark是多线程并发) 2. 由于进程空间独享,因此方便控制每个map, red ...

  6. R语言系列:自定义function

    在用R语言做各种事物时,用户自定义函数是不可或缺的.这期来讲讲如何自定义R的function.首先要介绍的是function的基本框架: myfunction <- function(arg1, ...

  7. 最简js深浅拷贝说明

    1.浅拷贝 浅拷贝是拷贝引用,拷贝后的引用都是指向同一个对象的实例,彼此之间的操作会互相影响.  浅拷贝分两种情况: 1.直接拷贝源对象的引用 2. 源对象拷贝实例,但其属性对象(类型为Object, ...

  8. phalcon: 目录分组后的acl权限控制

    phalcon: 目录分组后的acl权限控制 楼主在做acl权限的时候,发现官方的acl只能针对未分组的目录,如下: app/ ___|./controller ___|./logic ___|./p ...

  9. PowerDesigner用法和技巧

    PowerDesigner是一款功能非常强大的建模工具软件,足以与Rose比肩,同样是当今最著名的建模软件之一.Rose是专攻UML对象模型的建模工具,之后才向数据库建模发展,而PowerDesign ...

  10. Wannafly挑战赛14E无效位置

    https://www.nowcoder.com/acm/contest/81/E 给一个1-base数组{a},有N次操作,每次操作会使一个位置无效.一个区间的权值定义为这个区间里选出一些数的异或和 ...