1.你不知道的Java的四种引用类型
2.[Android] Android优化应用之——软引用和弱引用
3.对äºjavaçåç§å¼ç¨ï¼å¼ºå¼ç¨ã软å¼ç¨ãå¼±å¼ç¨ãèå¼ç¨çç解
4.Java中弱引用 丨 12分钟通过案例带你深入源码,分析其原理
你不知道的Java的四种引用类型
Java中提供了四种独特的引用类型:强引用、软引用、弱引用和虚引用。其中,强引用(FinalReference)是quicksupport 源码包内可见的,而其他三种引用类型(软引用、弱引用和虚引用)是公开的,可以直接在程序中使用。这些引用类型构成了Java内存管理的关键部分。
首先,强引用是最直接的引用形式,就像C语言中的指针,通过引用操作堆中的对象。例如,我们创建一个StringBuffer对象并用变量str指向它,str可以随时对对象进行操作。咪兔盒子源码
强引用的特点包括:可以直接访问目标对象,即使在内存紧张时也不回收,可能导致内存泄漏。如果强引用过多,可能会导致程序因内存不足(OOM)而崩溃。
软引用则稍弱于强引用,它允许在内存紧张时被回收。通过java.lang.ref.SoftReference实现。软引用用于内存敏感的缓存,如在堆内存接近极限时,软引用的对象会被回收,避免内存溢出。
弱引用进一步弱化了对对象的控制,当系统垃圾回收时,即使有弱引用,对象也可能被回收。源码表示发这对于缓存数据的管理很有帮助,既能利用内存,又能及时释放不再需要的资源。
虚引用是最弱的引用类型,几乎不提供对对象的控制。它们主要用于跟踪垃圾回收过程,当虚引用关联的对象被回收时,程序可以通过引用队列感知这一变化。
WeakHashMap是使用弱引用的典型例子,当内存不足时,它会自动释放与弱引用关联的数据。然而,如果WeakHashMap的key由强引用持有,它的行为就会类似普通的HashMap。
[Android] Android优化应用之——软引用和弱引用
Java中对象引用分为四种级别,即强引用、app视频直播源码软引用、弱引用和虚引用,它们灵活地控制着对象的生命周期。
软引用的特性是,内存充足时,垃圾回收器不会回收软引用对象;而内存不足时,回收器会回收这些对象的内存。软引用可用于内存敏感的高速缓存,与引用队列结合使用时,当软引用所引用的对象被垃圾回收,Java虚拟机会将其加入引用队列中。
弱引用比软引用拥有更短暂的生命周期,一旦内存不足,会立即回收。软引用和弱引用的区别在于内存管理策略的不同。
在Java.lang.ref包中,unity 游戏 源码 2018可以使用SoftReference、WeakReference和PhantomReference类分别表示软引用、弱引用和虚引用。ReferenceQueue类用于跟踪被垃圾回收的对象。
在Android开发中,防止内存溢出时,可利用软引用和弱引用技术处理大内存消耗且声明周期长的对象。
使用软引用示例:假设应用中频繁使用大量,如默认头像、游戏图标等。每次读取文件速度较慢,影响性能。为提高效率,将缓存至内存中。但大量占用大量内存,可能引发OutOfMemory异常。使用软引用可以解决此问题。
首先创建一个HashMap存储软引用对象。定义一个方法用于将Bitmap对象的软引用存储到HashMap中。获取时通过SoftReference类的get()方法获取Bitmap对象。使用软引用后,在发生OutOfMemory异常前,缓存的资源内存空间可被释放,避免内存上限导致应用崩溃。
需要注意的是,垃圾回收器回收Java对象前,SoftReference类提供的get方法返回其强引用。一旦垃圾回收,get方法返回null。在获取软引用对象的代码中,需判断是否为null,避免NullPointerException异常导致应用崩溃。
关于何时使用软引用与弱引用,通常使用软引用避免OutOfMemory异常,而使用弱引用关注性能,快速回收大内存占用对象。根据对象的使用频率判断,经常使用的对象更应使用软引用,不经常使用的则更适合弱引用。
WeakHashMap提供类似弱引用功能,对于给定的键,其映射的存在不会阻止垃圾回收器回收键,键回收后,条目从映射中移除。WeakHashMap同样利用了引用队列实现。
对äºjavaçåç§å¼ç¨ï¼å¼ºå¼ç¨ã软å¼ç¨ãå¼±å¼ç¨ãèå¼ç¨çç解
对äºJAVAç³»ç»çå¼ç¨æåç§æ¹å¼ã强å¼ç¨ ä¸è¬æçéè¿new ãå°å建对象çå¼ç¨ãæ们ä¸è¬å¼åé½æ¯ä½¿ç¨è¿ä¸ç§å¼ç¨ã
软å¼ç¨ SoftReference ä¸è¬æ¯åºç¨å åææçç¼åï¼ææç软å¼ç¨ç对象é½æ¯ä¿è¯å¨ç¨åºæåºOutOfMemoryErrorä¹åé½åå¾åæ¶å¨åæ¶ã
å¼±å¼ç¨ WeakReference ä¸è¬ç¨äºå®ç°ä¸äºè§èåçæ å°å ³ç³»,å®æ¯æ¯ä¸æ¬¡GCåæ¶åï¼é½ä¼å¯¹å¼ç¨çåæ¶ï¼å¹¶ä¸å°åæ¶çå¯¹è±¡å ¥éå°RefereceQueueï¼ç±ä¸å±å»åæ¸ çå·¥ä½ãæ¯å¦WeakHashMapå°±æ¯ä½¿ç¨å¼±å¼ç¨ãå©ç¨RefereceQueueå»åæ¸ çæ æçvalueæ°æ®ï¼é¿å å åæ³æ¼ã
èå¼ç¨ PhantomReference ä¸è¬ç¨äºåæ¶å¯¹è±¡çæ¸ çæä½ï¼æ¯ä¸ç§æ¯å®ç°finalizeæ¹æ³æ´å å¼¹æ§çæ¹å¼ãæ 论æ¯å¦åçGCï¼å¼ç¨é½æ¯è¿ånullï¼å¯¹è±¡ä¼åä¼å ¥éReferenceQueueï¼ä¾¿äºåºç¨å±å»ææåæ¶ç对象åæ¸ çå·¥ä½ã
Java中弱引用 丨 分钟通过案例带你深入源码,分析其原理
深入理解Java中的弱引用:分钟带你探索原理与应用
弱引用在Java中扮演着微妙的角色,它并非阻止垃圾回收,而是提供了一种特殊关联方式。JDK官方解释,弱引用主要用于实现那些不需要阻止其键或值被回收的映射。弱引用的出现,是为了在不再使用对象时,让垃圾回收器在合适的时候自动回收,从而避免内存溢出问题。
让我们通过实例来了解。想象一个场景,当我们维护一个map,存储了大量生命周期短暂的对象,如果key和value都由强引用指向,即使我们设置为null,对象仍不会被回收,因为map作为静态变量,其生命周期长。这时,弱引用的介入就显得尤为重要。通过将key变为弱引用,即使对象不再被方法引用,也能在垃圾回收时被释放,避免内存耗尽。
弱引用的使用并不复杂,只需将HashMap替换为WeakHashMap,将key变为WeakReference。当我们不再需要这些对象时,它们会被自动回收,如在上述例子中,输出的size为0,就证明了这一点。然而,这并不意味着value和entry会自动回收,这时WeakHashMap的expungeStaleEntries方法就发挥作用,它会清理不再引用的对象。
引用队列在此过程中扮演了关键角色,它帮助我们在弱引用被回收时高效地找到并处理相关对象,避免了遍历整个数据结构的性能消耗。在使用弱引用时,需要注意检查对象是否已被回收,以防空指针异常。
通过这些深入解析,我们对弱引用有了全面的认识,它在内存管理中的巧妙应用,为我们提供了一种解决内存溢出的有效手段。