- 浏览: 308440 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (187)
- JAVA (66)
- JS (2)
- AJAX (9)
- Servlet (5)
- eclipse (4)
- html (2)
- PL/SQL (9)
- SOAP (1)
- other (14)
- JavaScript (8)
- Struts2 (6)
- Spring (10)
- Hibernate (5)
- JSP (1)
- Linux (3)
- WebService (2)
- 数据结构 (1)
- DB (5)
- English (1)
- maven (4)
- Code standard (2)
- SQL (1)
- 软件架构 (1)
- Tomcat (2)
- windows (1)
- HSQL (0)
- Open source framework (0)
- Web (6)
- Compass (0)
- Flex (1)
- OSGI (1)
- python (3)
- groovy (2)
- JPA (2)
- svn (1)
- jetty (1)
最新评论
-
zjfshowtime:
it doesn't work !why
Tomcat 和 Jetty 下 JNDI 配置 DBCP 连接池 -
coco5012:
Useful
sql server日期时间函数 datetime -
烟花弥散:
弱弱的问一句,您的第一个举例中else 后面可以跟判断条件吗? ...
Java高手论道:你还在用if else吗? -
coco5012:
Not very simple
使用assembly plugin实现自定义打包 -
mqlfly2008:
[color=red][size=medium][size=x ...
Java高手论道:你还在用if else吗?
之前一直没有接触过弱引用这个概念,今天看到以后觉得挺新鲜,就查了查资料总结一下,希望对大家有所帮助。
要理解弱引用,首先要先了解一下强引用(Strong Reference), 其实我之前也并不了解强引用,虽然天天都在用。举例来说:
- String abc = new String ( "abcdf" );
这就是创建了一个String的实例然后在变量abc中保存一个强引用,为什么说它强(Strong)呢?这是跟垃圾回收器相关的,如果一个对象是通过强引
用链(Chain of Strong Reference) 访问到的,也就是像上面那样,那么这个对象是不会被垃圾回收器回收的,
这在正常情况下是正确的,因为你不想垃圾回收器回收你正在使用的对象。当内存空间不足时,Java虚拟机宁愿抛出OutOfMemory错误,是程序异常
终止,也不会为了解决内存不足而回收这类引用的对象。这就是使用强引用的一个问题, 强引用的另外一个常见的问题就是缓存,
特别是对于那些非常大的数据结构,像图片等等,平差情况下我们是希望程序能缓存这些大的数据结构的,因为重新加载非常耗费服务器资源。因为缓存就是为了避
免重新加载这些大的数据结构的,所以缓存中会保存一个指向内存中数据结构的引用,而这些引用通常都是强引用,所以这些引用会强迫这些大的数据结构保存在内
存中,除非用通过某些方法户知道哪一个数据结构不再需要保存在内存中了,然后再把他从缓存中清除。
弱引用就是不保证不被垃圾回收器回收的对象,它拥有比较短暂的生命周期,在垃圾回收器扫描它所管辖的内存区域过程中,一旦发现了只具有弱引用的对象,就会回收它的内存,不过一般情况下,垃圾回收器的线程优先级很低,也就不会很快发现那些只有弱引用的对象。
弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用的对象被垃圾回收的话,Java虚拟机就会把这个弱引用加入相关的引用队列中。
以下就是创建弱引用对象的例子。
- String abc = new String( "abcde" );
- WeakReference<String> wf= new WeakReference<String>(str, rq);
String abc1 = wf.get()//如果abcde这个对象没有被垃圾回收器回收,那么abc1就指向"abcde"对象
还可参照:http://yangguangfu.iteye.com/blog/849317
内存优化的两个类:SoftReference 和 WeakReference
如果你想写一个 Java 程序,观察某对象什么时候会被垃圾收集的执行绪清除,你必须要用一个 reference 记住此对象,以便随时观察,但是却因此造成此对象的 reference 数目一直无法为零, 使得对象无法被清除。
java.lang.ref.WeakReference
A obj = new A(); WeakReference wr = new WeakReference(obj); obj = null; //等待一段时间,obj对象就会被垃圾回收 ... if (wr.get()==null) { System.out.println("obj 已经被清除了 "); } else { System.out.println("obj 尚未被清除,其信息是 "+obj.toString()); }
不过,现在有了 Weak Reference 之后,这就可以迎刃而解了。如果你希望能随时取得某对象的信息,但又不想影响此对象的垃圾收集,那么你应该用 Weak Reference 来记住此对象,而不是用一般的 reference。
在此例中,透过 get() 可以取得此 Reference 的所指到的对象,如果传出值为 null 的话,代表此对象已经被清除。
这类的技巧,在设计 Optimizer 或 Debugger 这类的程序时常会用到,因为这类程序需要取得某对象的信息,但是不可以 影响此对象的垃圾收集。
java.lang.ref.SoftReference
Soft Reference 虽然和 Weak Reference 很类似,但是用途却不同。 被 Soft Reference 指到的对象,即使没有任何 Direct Reference,也不会被清除。一直要到 JVM 内存不足时且 没有 Direct Reference 时才会清除,SoftReference 是用来设计 object-cache 之用的。如此一来 SoftReference 不但可以把对象 cache 起来,也不会造成内存不足的错误 (OutOfMemoryError)。我觉得 Soft Reference 也适合拿来实作 pooling 的技巧。
A obj = new A();
SoftRefenrence sr = new SoftReference(obj);
引用时
if(sr!=null){ obj = sr.get(); }else{ obj = new A(); sr = new SoftReference(obj); }
发表评论
-
JAVA ArrayList深层 拷贝 克隆
2012-04-23 14:13 2557大家应该理解浅拷贝和深拷贝的区别: 浅拷贝:被复制对象的任何 ... -
深入 Lucene 索引机制
2011-09-21 21:49 616简介: Lucene 是一个 ... -
Apache DBUtils使用总结
2011-09-19 10:50 980Apache DBUtils使用总结 DBU ... -
Java搜索引擎 Lucene
2011-09-19 10:43 882Lucene 是一套用于全文 ... -
JAVA读取大文件
2011-09-13 10:27 3398/** * */ package com.b2s. ... -
Java性能优化技巧
2011-09-06 11:59 890摘要: ==================== ... -
java程序性能优化
2011-09-06 11:58 695一、避免在循环条件中使用复杂表达式 在不做编译优化 ... -
大家在普遍认识中对架构师这一职业有哪些误区
2011-09-04 10:26 745误区一 架构师与项目经理没有区别。大家经常在 ... -
Ibatis执行SQL操作把SQL打印到控制台
2011-08-10 10:46 2772要想让Ibatis打印SQL语句到控制台,可以在log4j.x ... -
用 PMD 铲除 bug
2011-06-08 17:33 1031简介: PMD 是一个开源的静态分析工具,是一个值得您添加 ... -
Web Service 实现分布式服务的基本原理
2011-05-24 13:27 1496简单的说, 就是客户端 ... -
Web Service概述
2011-05-24 10:16 1007Web Service是构建互联网 ... -
有关母亲的名人名言
2011-05-09 08:42 810God could not be everywhere and ... -
装饰器模式[Decorator]
2011-05-06 17:42 731装饰器模式 主要应用于这样一种场合,当你已经 ... -
Java 7已经完成的七大新功能预览
2011-05-06 12:26 1144今年的Devoxx大会又是一次有关Java 7进程的一 ... -
回归测试
2011-05-04 17:16 795回归测试, 英文是Regression testing。 ... -
jxl 使用总结收藏
2011-04-29 17:33 964jxl的一些总结 要 ... -
Struts1下如何实现国际化
2011-04-25 14:18 1139Struts1下如何实现国际化 1.ApplicationR ... -
JAVA静态导入(import static)详解
2011-04-20 17:52 4024在Java 5中,import语句得到了增强,以便提供甚至更加 ... -
java类型后添加三点的用法
2011-04-20 17:46 1142今天看到一个没见过的函数参数列表test(int... a), ...
相关推荐
从JDK 1.2版本开始,Java引入了四种不同级别的引用:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。这些引用类型提供了灵活的内存管理策略,允许...
本篇文章尝试从What、Why、How这三个角度来探索Java中的弱引用,理解Java中弱引用的定义、基本使用场景和使用方法。由于个人水平有限,叙述中难免存在不准确或是不清晰的地方,希望大家可以指出,谢谢大家:) 1....
2. **弱引用(Weak Reference)**:弱引用比软引用更弱,一旦发现一个对象只有弱引用,无论内存是否充足,垃圾收集器都会在下次GC时回收该对象。这使得弱引用非常适合用于构建不阻塞垃圾收集的关联数据结构。 3. **...
3. **弱引用(Weak Reference)**: - 弱引用比软引用更弱,只要垃圾收集器运行,无论内存是否充足,都会回收弱引用指向的对象。弱引用常用于实现内存敏感的缓存。 - 示例:`WeakReference<String> weakRef = new ...
弱引用 (Weak Reference) 弱引用是另一种允许被垃圾回收的引用类型,但与软引用相比,弱引用持有的对象生命周期更短。只要垃圾回收器线程扫描到被弱引用持有的对象,无论当前内存空间是否足够,都会回收这些对象。 ...
本文将深入探讨Java中三种特殊的引用类型——软引用(Soft Reference)、弱引用(Weak Reference)以及虚引用(Phantom Reference),并分析它们如何帮助我们更好地管理内存资源。 #### 二、基础知识回顾 在深入了解这三...
在Java中,`java.lang.ref`包提供了三种不同类型的引用:强引用(Strong Reference)、软引用(Soft Reference)和弱引用(Weak Reference)。我们主要关注弱引用,它通过`WeakReference`类来实现。弱引用对象在创建...
为了更好地理解和控制对象的生命周期,Java提供了四种不同类型的引用:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)以及虚引用(Phantom Reference)。每种引用都有其特定的...
2. **弱引用(Weak Reference)** - **定义**:弱引用不会阻止对象被垃圾收集。一旦所有强引用消失,即使有弱引用指向,对象也会被回收。 - **例子**:`WeakReference<Object> weakRef = new WeakReference(new ...
在这个过程中,软引用(Soft Reference)和弱引用(Weak Reference)是两种非常重要的工具,它们可以帮助我们避免内存泄漏,提高应用的内存效率。下面我们将深入探讨这两种引用类型及其在Android中的应用。 首先,...
3. **弱引用(Weak Reference)** - 弱引用不会阻止对象被垃圾收集,只要对象变为弱可达,垃圾收集器就会回收它。弱引用常用于避免内存泄漏,例如缓存图片。创建弱引用: ```java WeakReference<Widget> ...
3. 弱引用(Weak Reference) 弱引用比软引用的生存期更短。一旦创建了弱引用,那么无论系统内存是否充足,只要进行垃圾回收,就会回收弱引用指向的对象。弱引用通常用于避免内存泄漏,特别是在那些对象不再需要,...
本示例“java引用的demo”将深入探讨四种不同类型的引用:强引用、软引用、弱引用和虚引用。这些引用类型对于理解和优化内存管理至关重要,特别是在Android开发中,因为良好的内存管理能够提升应用性能并防止内存...
从JDK 1.2版本开始,Java引入了一种更为精细的引用类型管理机制,通过四种不同的引用类型:强引用、软引用、弱引用和虚引用,让开发者能够更加灵活地控制对象的生命周期。这种机制不仅提升了Java应用程序对内存使用...
3. **弱引用(Weak Reference)** - 弱引用比软引用更弱,无论内存是否充足,只要垃圾收集器工作,就会回收弱引用所指向的对象。这使得弱引用常用于实现内存敏感的数据结构,如`WeakHashMap`。 - 示例:`...
弱引用和强引用(StrongReference)的区别在于:当一个对象仅仅被弱引用指向,而没有任何其他强引用指向时,如果 GC 运行,那么该对象就会被回收。弱引用的语法是:`WeakReference<Car> weakCar = new WeakReference...
3. **弱引用(Weak Reference)**: - 弱引用比软引用更弱,它不会阻止对象被垃圾收集。通过`java.lang.ref.WeakReference`类创建。只要发现对象只有弱引用,JVM就会在下一次GC时回收该对象。弱引用适用于那些...
3. **弱引用(Weak Reference)**: - 弱引用比软引用更弱,它们不会阻止垃圾收集器回收对象。只要弱引用存在,对象就可访问,但一旦弱引用被垃圾收集器扫描到,无论内存是否充足,都会立即回收该对象。弱引用由`...
通常,Java有四种类型的引用:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。强引用是最常见的类型,当对象被强引用持有时,垃圾回收器不会回收...
3. 弱引用(Weak Reference): 弱引用比软引用更弱,它所引用的对象在下一次垃圾收集时就会被回收,无论当前内存状况如何。弱引用对象不会阻止垃圾收集,即使有其他对象通过强引用链可达,只要弱引用存在,垃圾...