想必很多朋友对OOM(OutOfMemory)这个错误不会陌生,而当遇到这种错误如何有效地解决这个问题呢?今天我们就来说一下如何利用软引用和弱引用来有效地解决程序中出现的OOM问题。下面是本文的目录大纲:

一.了解 强引用、软引用、弱引用、虚引用的概念

二.进一步理解软引用和弱引用

三.如何利用软引用和弱引用解决OOM问题

如果有不正之处,希望谅解和批评指正,不胜感激。

请尊重作者劳动成果,转载请标明原文链接:

http://www.cnblogs.com/dolphin0520/p/3784171.html

一.了解 强引用、软引用、弱引用、虚引用的概念
  在Java中,虽然不需要程序员手动去管理对象的生命周期,但是如果希望某些对象具备一定的生命周期的话(比如内存不足时JVM就会自动回收某些对象从而避免OutOfMemory的错误)就需要用到软引用和弱引用了。

从Java SE2开始,就提供了四种类型的引用:强引用、软引用、弱引用和虚引用。Java中提供这四种引用类型主要有两个目的:第一是可以让程序员通过代码的方式决定某些对象的生命周期;第二是有利于JVM进行垃圾回收。下面来阐述一下这四种类型引用的概念:

1.强引用(StrongReference)

强引用就是指在程序代码之中普遍存在的,比如下面这段代码中的object和str都是强引用:

1
2
Object object = new Object();
String str = “hello”;
  只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。比如下面这段代码:

public class Main {
public static void main(String[] args) {
new Main().fun1();
}

public void fun1() {Object object = new Object();Object[] objArr = new Object[1000];
}

}
  当运行至Object[] objArr = new Object[1000];这句时,如果内存不足,JVM会抛出OOM错误也不会回收object指向的对象。不过要注意的是,当fun1运行完之后,object和objArr都已经不存在了,所以它们指向的对象都会被JVM回收。

如果想中断强引用和某个对象之间的关联,可以显示地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。

比如Vector类的clear方法中就是通过将引用赋值为null来实现清理工作的:

复制代码
/**
* Removes the element at the specified position in this Vector.
* Shifts any subsequent elements to the left (subtracts one from their
* indices). Returns the element that was removed from the Vector.
*
* @throws ArrayIndexOutOfBoundsException if the index is out of range
* ({@code index < 0 || index >= size()})
* @param index the index of the element to be removed
* @return element that was removed
* @since 1.2
*/
public synchronized E remove(int index) {
modCount++;
if (index >= elementCount)
throw new ArrayIndexOutOfBoundsException(index);
Object oldValue = elementData[index];

int numMoved = elementCount - index - 1;
if (numMoved > 0)System.arraycopy(elementData, index+1, elementData, index,numMoved);
elementData[--elementCount] = null; // Let gc do its workreturn (E)oldValue;
}

复制代码
  2.软引用(SoftReference)

软引用是用来描述一些有用但并不是必需的对象,在Java中用java.lang.ref.SoftReference类来表示。对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。因此,这一点可以很好地用来解决OOM的问题,并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。

软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被JVM回收,这个软引用就会被加入到与之关联的引用队列中。下面是一个使用示例:

import java.lang.ref.SoftReference;

public class Main {
public static void main(String[] args) {

    SoftReference<String> sr = new SoftReference<String>(new String("hello"));System.out.println(sr.get());
}

}
  3.弱引用(WeakReference)

弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示。下面是使用示例:
import java.lang.ref.WeakReference;

public class Main {
public static void main(String[] args) {

    WeakReference<String> sr = new WeakReference<String>(new String("hello"));System.out.println(sr.get());System.gc();                //通知JVM的gc进行垃圾回收System.out.println(sr.get());
}

}
  输出结果为:

hello
null
  第二个输出结果是null,这说明只要JVM进行垃圾回收,被弱引用关联的对象必定会被回收掉。不过要注意的是,这里所说的被弱引用关联的对象是指只有弱引用与之关联,如果存在强引用同时与之关联,则进行垃圾回收时也不会回收该对象(软引用也是如此)。

弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被JVM回收,这个软引用就会被加入到与之关联的引用队列中。

4.虚引用(PhantomReference)

虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。

要注意的是,虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之 关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

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

jvm软引用、强引用、虚引用简介相关推荐

  1. 软引用和弱引用的区别_强、软、弱、虚引用的区别和使用

    原文阅读: 强.软.弱.虚引用的区别和使用​mp.weixin.qq.com Java提供了四种级别的应用类型:强引用.软引用.弱引用及虚引用.那么这四种引用类型有什么区别呢? 首先我们通过一张图来看 ...

  2. java中四种引用类型(对象的强、软、弱和虚引用)

    2019独角兽企业重金招聘Python工程师标准>>> 对象的强.软.弱和虚引用在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有 ...

  3. 对象的强、软、弱和虚引用

    本文介绍对象的强.软.弱和虚引用的概念.应用及其在UML中的表示. 1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有 ...

  4. Java:对象的强、软、弱和虚引用

    见:http://zhangjunhd.blog.51cto.com/113473/53092 maven/Java/web/bootstrap/dataTable/app开发QQ群:56686262 ...

  5. 【重难点】【Java基础 01】一致性哈希算法、sleep() 和wait() 的区别、强软弱虚引用

    [重难点][Java基础 01]一致性哈希算法.sleep() 和wait() 的区别.强软弱虚引用 文章目录 [重难点][Java基础 01]一致性哈希算法.sleep() 和wait() 的区别. ...

  6. 回过头来看对象的四种状态强软弱虚引用的理解

    一.对象的四种引用状态描述 在JDK1.2之后,Java对引用的概念进行了扩充,将引用分为强引用(Strong Reference).软引用(Soft Reference).弱引用(Weak Refe ...

  7. 强软弱虚引用,只有体会过了,才能记住

    以前学习强软弱虚引用的时候,只是走马观花看看博客,并没有自己写代码去实践.去证明,导致每次看完后,过不了多久就忘了,后来下定决心,一定要自己敲敲代码,这样才能让印象更加深刻,古人云:纸上得来终觉浅,绝 ...

  8. java虚引用作用_深入理解Java中的引用(二)——强软弱虚引用

    深入理解Java中的引用(二)--强软弱虚引用 在上一篇文章中介绍了Java的Reference类,本篇文章介绍他的四个子类:强引用.软引用.弱引用.虚引用. 强引用(StrongReference) ...

  9. Java中的强软弱虚引用《对Java的分析总结三》

    <对Java的分析总结>-Java中的强软弱虚引用 强引用 StrongReference 软引用 SoftReference 弱引用 WeakReference 虚引用 PlantomR ...

  10. jvm系列 (四) ---强、软、弱、虚引用

    java引用 目录 jvm系列(一):jvm内存区域与溢出 jvm系列(二):垃圾收集器与内存分配策略 jvm系列(三):锁的优化 我的博客目录 为什么将引用分为不同的强度 因为我们需要实现这样一种情 ...

最新文章

  1. linux 多线程端口扫描,python 多线程完成linux服务器端口扫描
  2. 开源分布式中间件 DBLE Schema.xml 配置解析
  3. 大数据分析中国冬季重度雾霾的成因(一)
  4. java爬虫怎么确定url连接_Java爬虫之抓取一个网站上的全部链接
  5. javase获取项目根目录_JavaSE:如何设置/获取您自己的文件和目录属性
  6. php分页类smary,Smarty分页实现方法完整实例
  7. 不能创建对象qmdispatch_XP突然弹出“automation 服务器不能创建对象”的有效解决方法...
  8. SVN中Branch/tag的比较
  9. NYOJ-86 找球号(一)
  10. 计算机换色带技巧,安装与更换针式打印机的色带的详细方法(图文教程)
  11. 在线社交网络(Online Social Networks,OSNs)
  12. 管中窥豹之淘宝大数据平台
  13. 2022高性价蓝牙耳机排名,500元内真无线蓝牙耳机品牌推荐
  14. 信号处理原理-郑方(学习笔记)
  15. 懒,不想登录Cisco Packet Tracer 7.3怎么办?
  16. 实现保留3位有效数字(四舍六入五成双规则)
  17. java 电商 插件 开发_JAVA项目实战开发电商项目案例(六与七)商品分类与商品模块管理开发...
  18. Android 图片选择库美哭了
  19. 构建 WCF 路由器 part 2 from MSDN
  20. 服务器c盘有个inetpub文件夹,Win10正式版C盘inetpub文件夹可以删除吗 Win10正式版C盘inetpub文件夹删不掉怎么办...

热门文章

  1. vue项目引入阿里云图标的4种方式
  2. 数据库:增删改查操作
  3. python 通配符用法,python - 通配符
  4. 阿里云效maven私服
  5. libreelec投屏_我的NAS+HTPC折腾之旅 篇八:LibreELEC部署媒体中心服务器emby和jellyfin篇...
  6. 金碟打印凭证或多联纸格式时十几张后错位
  7. 数据库事务隔离级别与锁
  8. 微信小程序标签样式的优先级
  9. Windows:电源计划:隐藏在深处的卓越性能,Get正确打开方式
  10. 无痛学习ISAC(一)