urlname
type
Post
password
SyncToConfluence
category
学习笔记
date
Apr 5, 2024
slug
01HTPHD8967170DYQ7VNNKNYYY
icon
Button
catalog
summary
tags
JVM
cover
Status
BusyTime
Status 1
status
Published

分类

  • 强引用
  • 软引用
  • 弱引用
  • 虚引用

作用机制

  • 在JVM GC的时候,会判断该对象的引用类型是哪一类
  • 强引用:不管内存够不够,都不会回收
  • 软引用:只有在内存紧张的时候,才会进行回收
  • 弱引用:在下一次GC的时候,被回收
  • 虚引用:随时可能被回收,没有具体回收时机

回收优先级

强引用 < 软引用 < 弱引用 < 虚引用

使用场景说明

  • 强引用:没有特别表示的普通对象引用都是强引用。
  • 软引用:适用于实现内存敏感的缓存,如实现那些可选的缓存,即在内存足够时保持对象不被回收,而在内存紧张时可以自动释放内存的缓存。
  • 弱引用:适用于更灵活的缓存,如WeakHashMap。
  • 虚引用:管理堆外内存,或者是跟踪对象被垃圾回收的状态(主要与其引用队列一起使用)。

使用场景举例

软引用:

  1. 缓存实现(Memory-Sensitive Caches)
      • 图像缓存:图像处理应用或者Web服务器可能会使用软引用缓存大量图像。当应用运行在内存充足的环境中,这些图像可以被快速地从缓存中检索。但当JVM内存紧张时,这些缓存的图像可以被垃圾收集器回收以释放内存。
      • 数据缓存:数据库应用或数据密集型应用可能会将频繁访问的查询结果或重要的数据集缓存为软引用对象,从而加快数据访问速度。如果内存充足,这些数据可以长时间保留在内存中,加快应用的响应速度。内存不足时,这些缓存数据可以被自动清理。
  1. 预加载内容
      • 应用程序可能会预加载可能很快被用户访问的内容和资源,使用软引用保持这些内容,以便在内存充足的情况下提高性能,而不会在内存紧张时占用太多资源。

弱引用:

  1. 监听器和回调: 弱引用可以用于对监听器或回调的引用,这样可以确保持有弱引用的监听器不会阻止GC回收事件发布者。
  1. 缓存机制: 弱引用同样适用于缓存系统,特别是在那些缓存项可以被自由回收,但又不希望立即回收的场景中。与软引用相比,弱引用的生命周期更短,一旦垃圾收集器发现了只具有弱引用的对象,就会回收它。
  1. 映射键或值: 使用弱引用作为映射(Map)的键或值,可以创建一种自动管理的存储结构,其中的条目不会阻止其键(或值)被垃圾收集器回收,如:WeakHashMap

虚引用

  1. 资源清理: 由于虚引用必须和引用队列(ReferenceQueue)一起使用,当GC准备回收对象时,虚引用会被加入到与之关联的引用队列中。使得程序可以在对象被彻底移除之前,进行一些清理工作,比如释放堆外内存(Direct ByteBuffer)或其他特殊资源。
  1. 监测对象回收: 虚引用可以用来确定对象何时被从内存中移除,从而实现一些特定的内存监控和分析工具。

使用实例

软引用

弱引用

虚引用

递归算法总结AOSP-源码下载编译
Loading...