`
guojianhui0906
  • 浏览: 48252 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

内存优化的两个类:weakReference、 softReference

    博客分类:
  • java
阅读更多
如果你想写一个 Java 程序,观察某对象什么时候会被垃圾收集的执行绪清除,你必须要用一个 reference 记住此对象,以便随时观察,但是却因此造成此对象的 reference 数目一直无法为零, 使得对象无法被清除。

 java.lang.ref.WeakReference

  不过,现在有了 Weak Reference 之后,这就可以迎刃而解了。如果你希望能随时取得某对象的信息,但又不想影响此对象的垃圾收集,那么你应该用 Weak Reference 来记住此对象,而不是用一般的 reference。 
 	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());
 	  
	  }

  在此例中,透过 get() 可以取得此 Reference 的所指到的对象,如果传出值为 null 的话,代表此对象已经被清除。

  这类的技巧,在设计 Optimizer 或 Debugger 这类的程序时常会用到,因为这类程序需要取得某对象的信息,但是不可以 影响此对象的垃圾收集。

  
1 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);
 	 
 	   }
分享到:
评论

相关推荐

    防止内存溢出浅析

    3. **使用弱引用和软引用**: WeakReference和SoftReference是Java提供的两种特殊引用类型,它们不会阻止GC回收对象。弱引用在GC运行时会立即清除,而软引用则在系统内存紧张时才会被回收。合理使用这两种引用,可以...

    Android 内存溢出问题

    本篇文章将深入探讨Android内存管理的两个核心概念:堆(Heap)和栈(Stack),以及如何理解和解决Android内存溢出问题。 1. 堆与栈 堆和栈是Java虚拟机(JVM)中的两种主要内存区域,它们各自具有特定的用途和...

    安卓Android源码——防止内存溢出浅析.zip

    - 使用WeakReference或SoftReference:这两种引用类型不会阻止GC回收对象,可以避免内存泄漏。 - 控制Bitmap使用:使用BitmapFactory.Options来控制解码时的大小,避免加载过大图片导致内存溢出。 - 适当使用内存...

    内存清理案例(clean memory)

    WeakReference在对象没有其他强引用时会自动被GC回收,而SoftReference则在系统内存紧张时才回收。 4. **Activity管理**:确保正确处理Activity的生命周期,特别是在onPause()和onStop()方法中释放可重用的资源,如...

    安卓Android源码——图片下载以及内存处理防OOM.zip

    在安卓应用开发中,图片加载和内存管理是两个至关重要的环节。Android系统作为一个开放源码的平台,提供了丰富的API和工具来帮助开发者处理这些问题。本资料包“安卓Android源码——图片下载以及内存处理防OOM.zip”...

    android内存分析工具

    - **比较视图(Comparison)**:对比两个不同的heap dump,找出内存消耗的变化。 - **碎片分析(Shallow Heap / Retained Heap)**:区分对象自身占用的内存(Shallow Heap)和其间接导致的内存占用(Retained ...

    Android-HeapSnap是一款针对Android进程堆内存泄露追踪工具

    - 使用WeakReference或SoftReference来存储可能长时间存在的对象。 - 注意广播接收器、服务和ContentProvider的生命周期管理。 6. **与其他内存分析工具的比较**: - LeakCanary:轻量级的内存泄漏检测库,适合...

    Android应用源码之防止内存溢出浅析.zip

    5. **使用WeakReference和SoftReference**:这两类引用可以帮助我们创建一种“弱连接”,让对象在不再被其他强引用时能够被GC回收。在处理大对象或者需要延迟回收的场景下,可以考虑使用。 6. **避免内存抖动**:...

    android 多个activity加载多张大图内存处理

    5. **使用BitmapFactory.decodeStream**或**BitmapRegionDecoder**: 这两个方法可以从输入流或文件中按需解码图片,避免一次性加载整个图片到内存中。 6. **利用硬件加速**: 在Android 3.0及以上版本,可以开启硬件...

    图片下载以及内存处理防OOM.zip

    在Android开发中,图片下载和内存管理是两个关键的环节,尤其对于性能优化和避免内存溢出(Out of Memory, OOM)问题至关重要。本文将深入探讨这些知识点,并结合源码学习来提升Android应用的效率。 一、图片下载 ...

    Java内存溢出和内存泄露共4页.pdf.zip

    内存溢出(Memory Overflow)和内存泄露(Memory Leak)是两个常见的问题,它们会导致程序性能下降,甚至崩溃。了解并解决这些问题对于优化Java应用程序至关重要。 内存溢出是指程序在申请内存时,无法在堆内存中...

    基于Android防止内存溢出浅析

    在Android开发中,内存管理是至关重要的一个环节,因为不当的内存使用可能导致应用程序崩溃或性能下降,最常见的问题就是内存溢出(Out Of Memory,简称OOM)。本文将深入浅析如何在Android环境中预防和处理内存溢出...

    OOMDemo,.zip

    使用WeakReference、SoftReference等可以帮助识别和处理这类问题。 4. **数据结构选择**:根据实际需求选择合适的数据结构,避免使用占用内存较大的数据结构如ArrayList代替LinkedList。 5. **使用内存分析工具**...

    Java系统中内存泄漏测试方法的研究

    1. 适当地使用弱引用(WeakReference)、软引用(SoftReference)和虚引用(PhantomReference)。 2. 避免使用静态集合类,尤其是在不需要长期存储数据的情况下。 3. 使用完线程局部变量后及时清理。 4. 及时解除...

    Android的内存机制和溢出说明

    Android系统基于Dalvik或ART(Android RunTime)虚拟机,这两种虚拟机都对内存管理有特定的规定。由于Android设备的内存有限,理解内存机制有助于优化应用性能,防止内存溢出(Memory Leak)等问题。 首先,Android...

    java 内存泄露

    但在某些情况下,如使用了WeakReference、SoftReference等弱引用,或者有线程局部变量(ThreadLocal)未正确清理,就可能导致类加载器无法被回收,从而引发内存泄露。 三、内存泄露的诊断方法 1. **使用工具辅助...

    介绍Java中的内存泄漏Java开发Java经验技巧共3页

    1. 使用弱引用(WeakReference)和软引用(SoftReference):这两种引用不会阻止对象被GC回收,可以在不再需要对象时使用它们来保持对对象的引用。 2. 注意集合类的使用:确保在不再需要集合中的元素时,从集合中移...

    JVM 77道面试题和答案.docx

    这两个区域由所有线程共享,GC会关注这些区域的内存管理。 - **直接内存**:不在JVM规范的运行时数据区内,但使用NIO可以直接分配,以提升性能,减少Java堆与本地堆间的数据复制。 10. **程序计数器**:记录当前...

    java内存模型介绍

    - **合理使用`WeakReference`、`SoftReference`和`PhantomReference`**:这些引用类型可以帮助更好地控制对象的生命周期,从而减少内存泄漏的风险。 - **监控和分析内存使用情况**:使用工具如VisualVM等来监控内存...

Global site tag (gtag.js) - Google Analytics