从 JDK1.2 版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:

强引用 StrongReference

软引用 SoftReference

弱引用 WeakReference

虚引用 PhantomReference

Android 中采用了标注与清理(Mark and Sweep)回收算法:

从”GC Roots” 集合开始,将内存整个遍历一次,保留所有可以被 GC Roots 直接或间接引用到的对象,而剩下的对象都当作垃圾对待并回收。

在 Android 中,每一个应用程序对应有一个单独的 Dalvik 虚拟机实例,而每一个 Dalvik 虚拟机的大小是固定的(如 32M,可以通过ActivityManager.getMemoryClass()获得)。这意味着我们可以使用的内存不是无节制的。所以即使有着 GC 帮助我们回收无用内存,还是需要在开发过程中注意对内存的引用。否则,就会导致内存泄露。

强引用 StrongReference

强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java 虚拟机宁愿抛出 OutOfMemoryError 错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。如代码 String s=”abc” 中变量 s 就是字符串对象”abc” 的一个强引用。只要你给强引用对象 s 赋空值 null, 该对象就可以被垃圾回收器回收。因为该对象此时不再含有其他强引用。

弱引用 WeakReference

弱引用通过类 WeakReference 来表示。弱引用并不能阻止垃圾回收。如果使用一个强引用的话,只要该引用存在,那么被引用的对象是不能被回收的。弱引用则没有这个问题。在垃圾回收器运行的时候,如果对一个对象的所有引用都是弱引用的话,该对象会被回收。

软引用 SoftReference

弱引用和软引用的区别在于:如果一个对象只具有软引用,若内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,才会回收这些对象的内存。

而只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。

所以从引用的强度来讲: 强引用 > 软引用 > 弱引用。

虚引用 PhantomReference

一个只被虚引用持有的对象可能会在任何时候被 GC 回收。虚引用对对象的生存周期完全没有影响,也无法通过虚引用来获取对象实例,仅仅能在对象被回收时,得到一个系统通知(只能通过是否被加入到 ReferenceQueue 来判断是否被 GC,这也是唯一判断对象是否被 GC 的途径)。

我们都知道,java 的 Object 类里面有个 finalize 方法,它的工作原理是这样的:一旦垃圾回收器准备好释放对象占用的内存空间,将首先调用其 finalize 方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。但是,问题在于,虚拟机不能保证 finalize 何时被调用,因为 GC 的运行时间是不固定的。

使用虚引用就可以解决这个问题,虚引用主要用来跟踪对象被垃圾回收的活动,主要用来实现比较精细的内存使用控制,这对于 Android 设备来说是很有意义的。比如,我们可以在确定一个 Bitmap 被回收后,再去申请另外一个 Bitmap 的内存,通过这种方式可以使得程序所消耗的内存维持在一个相对较低且稳定的水平。

java四中引用使用场景_Android中四种引用以及适用场景相关推荐

  1. 各种存储分配算法java代码实现_Java实现操作系统中四种动态内存分配算法:BF+NF+WF+FF...

    1 概述 本文是利用Java实现操作系统中的四种动态内存分配方式 ,分别是:BF NF WF FF 分两部分,第一部分是介绍四种分配方式的概念以及例子,第二部分是代码实现以及讲解. 2 四种分配方式 ...

  2. Java四种引用简介

    引语: 我们知道java相比C,C++中没有令人头痛的指针,但是却有和指针作用相似的引用对象(Reference),就是常说的引用,比如,Object obj = new Object():这个obj ...

  3. JVM学习笔记之四 四种引用和垃圾回收的两次标记

    四种引用和两次标记 四种引用 java中的数据类型我们知道是分为基本数据类型和引用类型的.基本数据类型是8种,分别是boolean byte short int long double float c ...

  4. Android中四种补间动画的使用示例(附代码下载)

    场景 Android中四种补间动画. 透明度渐变动画 旋转动画 缩放动画 平移动画 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的 ...

  5. Java 中的四种引用及垃圾回收策略

    Java 中有四种引用:强引用.软引用.弱引用.虚引用: 其主要区别在于垃圾回收时是否进行回收: 1.强引用 使用最普遍的引用.如果一个对象具有强引用,那就 类似于必不可少的生活用品,垃圾回收器绝不会 ...

  6. Java 中的四种引用

    垃圾收集器与内存分配策略参考目录: 1.判断Java 对象实例是否死亡 2. Java 中的四种引用 3.垃圾收集算法 4. Java9中的GC 调优 5.内存分配与回收策略 在进行垃圾回收之前,虚拟 ...

  7. java中的强软弱虚_详解Java的四种引用——强软弱虚,颠覆你的认知!

    强软弱虚 java中的数据被类型分为了两类,它们分别是基本类型和引用类型.一般我们new出来的对象都属于引用类型的范畴.我们知道java是有垃圾回收机制的一种语言,根据垃圾回收时的策略,java将对于 ...

  8. Java对象的四种引用方式

    本文会按照以下思路进行: (1)Java的四种对象引用的基本概念 (2)四种对象引用的差异对比 (3)对象可及性的判断以及与垃圾回收机制的关系 (4)引用队列ReferenceQueue的介绍 (5) ...

  9. Java对象的四种引用

    前言 在JDK1.2之前,创建的对象只有在处于可触及(reachable)的状态下,才能被程序使用.也就是说,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.垃圾回收器一旦发现这些无用对象, ...

最新文章

  1. 数据结构源码笔记(C语言):希尔插入排序
  2. 搭建K8s集群(二进制方式)-操作系统初始化
  3. mysql 编码种类_MySQL 编码
  4. centos系统 查看当前python执行的进程
  5. 冷室压铸机行业调研报告 - 市场现状分析与发展前景预测
  6. 它决定支付30万美元的勒索金
  7. creo扫描选择多条链作为轨迹_Proe/Creo曲面造型·蓝牙耳机纹理曲面纹理
  8. 项目实施过程中的标志性事件——里程碑
  9. 可编程器件的编程原理
  10. 手把手教大家搭建微信公众号查题
  11. 软件需求收集、挖掘和分析方法
  12. uni-app实现微信小程序长按拍视频的功能
  13. java: 警告: 源发行版 xx 需要目标发行版 1.10 解决方案
  14. Taro 小程序开发大型实战(三):实现微信和支付宝多端登录
  15. 为什么创业的人都爱跑步
  16. html语言的title在哪,网页中title标题使用地方有哪些
  17. flutter菜鸟教程!mysql半同步的主从搭建方式
  18. 2021-2027全球与中国太阳能EVA板市场现状及未来发展趋势
  19. JavaWeb - 接口幂等性
  20. Ptcms在php7.2.10下的采集调试

热门文章

  1. NFC顺物联网之势崛起,意法半导体实力几何?
  2. 龙芯1B200按键控制led
  3. 从零开始搭建个人博客
  4. 运载火箭弹道飞行程序matlab,机载运载火箭飞行程序设计及仿真
  5. js公历日期转为农历日期
  6. python画笑脸表情_关于Python:Python-用ASCII字符替换unicode表情符号
  7. matlab dock什么意思,Mac电脑Dock是什么意思,Dock怎么用?
  8. 关于Character类
  9. 【Excel VBA】单元格变更事件,单元格内容变更自动触发:Worksheet_Change
  10. 安卓——Galleryamp;amp;ImageSwitcher制作图片浏览器