文章导读:

从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用, 本章内容介绍了Reference的概念和语法实现. 附件有源码下载

视频与源码下载:http://edu.51cto.com/lecturer/index/user_id-9166337.html  (代码在视频的附件中)

强引用(StrongReference) :

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

 public class RefDemo {

 // 强引用, JVM -Xms5M  -Xmx10M
public static void demo01(){
// 强引用,即使内存溢出,垃圾回收也不会回收此对象
byte[] b = new byte[1024*1024*10]; // 默认创建10MB的byte数组
}
}

为了方便测试首先要在JVM中配堆内存大小如图所示:

我们声明的 byte[] b = new byte[1024*1024*10] 是强引用类型,及时内存溢出GC也不会回收强引用的对象, 因此会抛出堆内存溢出

软引用(SoftReference):

软引用是除了强引用外, 最强的引用类型. 可以通过SoftReference使用软引用. 一个持有软引用的对象,不会被JVM很快回收. JVM会根据当前堆的使用情况来判断何时回收. 当堆的使用率接近临界点时, 才会去回收软引用的对象. 只要有足够的内存, 软引用变可以在内存中存货很长时间.因此, 软引用可以用于实现对内存敏感的cache

     // 软引用: 内存不够才会被回收,项目中的缓存
public static void demo02(){
MyObject myO=new MyObject();
// 采用软引用存储
SoftReference<MyObject> softRef=new SoftReference<MyObject>(myO);
myO = null; //强引用已经失效
// 手动调用垃圾回收,一般JVM自动调用
System.out.println(softRef.get());
System.gc(); // 如果内存足够,软引用是不会被回收的
System.out.println(softRef.get());
// 不断的填充堆空间,如果内存不够则回收
List<Object> oList=new ArrayList<Object>();
for(int i=1;i<=10;i++){
// 每次填充1MB
oList.add(new byte[1024*1024*1]);
System.out.println("当前虚拟机中的内存总量" + Runtime.getRuntime().totalMemory()/1024.00/1024 + "MB");
System.out.println("i:" + i);
// 软引用: 内存不够才会被回收
System.gc();
}
}

从运行结果我们可以看出, GC在内存不充足的时候才会回收软引用的空间. 但是回收的空间也不足以存储生成的数组对象,因此还是抛出了堆内存溢出

弱引用 (WeakReference):

弱引用是一种比软引用较弱的引用类型, 在系统GC时, 只要发现弱引用, 不管系统堆空间是否足够, 都会将对象进行回收. 但是由于垃圾回收器的线程通常优先级很低. 因此, 并不一定能很快发现持有的弱引用的对象. 在这种情况下. 弱引用对象可以存在较长时间.

 public class MyObject {
@Override
public String toString() {
return "I am MyObject";
}
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("MyObject's finalize called"); // 被回收时输出
}
public static void main(String[] args) throws InterruptedException {
MyObject obj = new MyObject();
WeakReference<MyObject> softRef = new WeakReference<MyObject>(obj); // 创建一个引用队列
System.gc(); // 因为还有强引用因此不能回收,一般在生产者模式下不会手动调用垃圾回收方法
System.out.println("获取弱引用:" + softRef.get());
obj = null;
System.gc(); // 无论空间是否充足都应该回收弱引用对象
}
}

我们会发现弱引用的对象,只要GC调用则就会被回收

Java强、软、弱引用总结:

01_Java 软、弱引用语法介绍的更多相关文章

  1. Android性能优化之巧用软引用与弱引用优化内存使用

    前言: 从事Android开发的同学都知道移动设备的内存使用是非常敏感的话题,今天我们来看下如何使用软引用与弱引用来优化内存使用.下面来理解几个概念. 1.StrongReference(强引用) 强 ...

  2. java强引用、软引用、弱引用、虚引用

    前言概述 在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象.这就像在日常生活中,从商店购买了某样物品后,如果有用,就一直保留它,否则就把它扔到垃圾箱,由清洁工人收走 ...

  3. 关于Java的软引用及弱引用

    概念介绍   1   Reference      描述一个对象的引用.其内部维持一个queue引用,用于跟踪对象的回收情况,当对象被回收时将当前reference引用入队   2   SoftRef ...

  4. [Android] Android开发优化之——使用软引用和弱引用

      Java从JDK1.2版本开始,就把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 这里重点介绍一下软引用和弱引用. ...

  5. 九、Android学习笔记_ Android开发中使用软引用和弱引用防止内存溢出

    在<Effective Java 2nd Edition>中,第6条“消除过期的对象引用”提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象 ...

  6. Android性能提升之强引用、软引用、弱引用、虚引用使用

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52637333 背景:收到公众投稿 ...

  7. Android开发优化之——使用软引用和弱引用

    Java从JDK1.2版本开始,就把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 这里重点介绍一下软引用和弱引用. 如果 ...

  8. Java强引用、软引用、弱引用及虚引用深入探讨

    强引用.软引用.弱引用和虚引用深入探讨 为了更灵活的控制对象的生命周期,在JDK1.2之后,引用被划分为强引用.软引用.弱引用.虚引用四种类型,每种类型有不同的生命周期,它们不同的地方就在于垃圾回收器 ...

  9. Android优化之软引用和弱引用

    Java从JDK1.2版本开始,就把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用.这里重点介绍一下软引用和弱引用. 如果一 ...

随机推荐

  1. AngularJS(三):重复HTML元素、数据绑定

    本文也同步发表在我的公众号“我的天空” 重复HTML元素 在前端的页面编写中,我们会经常遇到重复HTML元素,譬如绘制表格.菜单等,如以下代码显示一个简单的li列表: <body>    ...

  2. canvas、svg、canvas与svg的区别

    一.canvas canvas 画布,位图 <canvas> 标签定义图形,比如图表和其他图像,您必须使用脚本来绘制图形 注意:不要在style中给canvas设置宽高,会有位移差 can ...

  3. JavaWeb_03_JavaScript学习小结1

    1.javascript的简介 是基于对象和事件驱动的语言,应用于客户端. 基于对象: 提供好了很多对象,可以直接拿过来使用 事件驱动: html做网站静态效果,javascript动态效果 客户端: ...

  4. C#调用C++接口返回字符串的做法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 现在有这样一种情景,假如C#调用C++接口需要返回一个字符串.因为字符串是不定长的,因此传递一个定长的字符串进去是不合 ...

  5. pytest+allure2+jenkins环境部署

    1.pycharm安装allure-pytest 2.jenkins -> 系统管理 -> 插件管理 -> 可选插件中过滤Allure,勾选对应插件安装 如下图:  3.安装完插件后 ...

  6. freebsd问题

    http://community.spiceworks.com/topic/91708-server-freezes

  7. xmlHttpRequest在Firefox下不起作用?

    描述: XMLHttpRequest 在IE下正常,在Firefox下不起作用. 原因: XMLHttpRequest 对象的 onreadystatechange 不会在Firefox下执行, 解放 ...

  8. c/c++的const和static区别

    C语言中的const和static用来修饰变量或者函数,用const修饰表示不可改变,用static修饰表示变量或者函数是静态的,作用域控制在函数内. const定义的常量在超出其作用域之后其空间会被 ...

  9. Exchange 用户邮箱导入/导出

    在第2部分中,我将向您介绍如何使用Exchange Server中提供的新cmdlet导入/导出数据,以及如何查看导入和导出的信息统计信息这样做. 走起! 将数据从PST文件导入到邮箱 现在是时候尝试 ...

  10. allure使用简介

    #安装依赖包pip install requests_toolbeltpip install pyyamlpip install pytest-allure-adaptor #安装allure2 说明 ...