引用那些事

简介: 引用那些事

普通对象

普通对象在标记为垃圾时。会把他添加到一个队列中,然后唤醒一个专门用于调用finazlly的damen守护线程去掉用队列里面对象的finazlly函数。

下一次垃圾回收时如果还在队列中则直接释放这个对象的内存空间。如果finazlly中更改了这个对象的引用关系即他被别人引用了那么这时候就不会释放它了,不过下一次再发生gc时不把他添加队列里了直接进行清除

ps:所以finazlly方法更像是一次死亡前的讣告和binder的死亡监听很像。

在binder的死亡监听中可以进行再次启动或绑定服务,finazlly方法也是只要让别的存活的对象引用了它那么就可以不被回收

根据上面得知finalzy函数是有一个专门的线程调用它并且这个damen线程是虚拟机runtine启动start时候进行的无法干预这个线程的运行

虚引用

所以还是用虚引用比较好,使用者知道指定引用队列也可以进行自己指定线程去执行实际对象清理后的回收操作。

也就是:虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。

案例

也就是leekcanry所做的事情创建虚引用来引用acticity,当引用activity对象被回收的时候将会放到指定的引用队列中(用户定义)。一段时间后(在leek中指的是系统idle的时候因为这个时候会回收不在引用的activity如果这时候引用队列还存在的话则表示内存泄露了)

ondestory时先放到队列1中在用一个虚引用和队列2来持有activity对象代表该activity销毁之后系统idle的时候会回收activity。

注册一个idle回调,在这个里面去检查队列2中是否有activity如果有代表没有泄露因为内存回收了。如果没有代表进行一次手动gc再看队列中还有没有activity,没有被回收就算是发生内存泄漏


相关文章
|
Linux 数据安全/隐私保护 流计算
RedHat红帽认证---RHCE
RedHat红帽认证---RHCE
247 0
|
11月前
|
监控 供应链 安全
云计算环境下的等保测评
云计算环境以其灵活、高效和可扩展性,成为现代企业信息化基础设施的重要组成部分。然而,云环境的复杂性和动态性也给信息安全带来了新的挑战,尤其是等级保护测评(简称“等保测评”)在云环境下变得更加复杂和重要。
194 0
|
存储 Unix 虚拟化
Docker容器简介
Docker是一种轻量级的虚拟化技术,它通过容器化应用,提高了硬件资源利用率,简化了应用的部署、运输和运行,且与虚拟机相比,具有更快的交付速度和更低的资源消耗。
262 2
|
vr&ar 图形学 API
Unity与VR控制器交互全解:从基础配置到力反馈应用,多角度提升虚拟现实游戏的真实感与沉浸体验大揭秘
【8月更文挑战第31天】虚拟现实(VR)技术迅猛发展,Unity作为主流游戏开发引擎,支持多种VR硬件并提供丰富的API,尤其在VR控制器交互设计上具备高度灵活性。本文详细介绍了如何在Unity中配置VR支持、设置控制器、实现按钮交互及力反馈,结合碰撞检测和物理引擎提升真实感,助力开发者创造沉浸式体验。
673 0
|
Java 关系型数据库 MySQL
基于SpringBoot+Vue企业级工位管理系统(源码+部署说明+演示视频+源码介绍+lw)(1)
基于SpringBoot+Vue企业级工位管理系统(源码+部署说明+演示视频+源码介绍+lw)
266 0
|
存储 编译器
|
移动开发 JavaScript 前端开发
原生js如何获取dom元素的自定义属性
原生js如何获取dom元素的自定义属性
309 0
|
人工智能 Dart 算法
Flutter AI版本五子棋
在上一篇文章中,讲解了如何实现双人在本地对战的五子棋,但是只有一个人的时候就不太好玩,同时博主也没有把五子棋相关的文章写过瘾。那么这篇文章,我们来实现一个功能更加丰富的五子棋吧!
|
存储 监控 安全
JVM工作原理与实战(二十二):方法区的垃圾回收
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了Java的内存管理和自动垃圾回收、方法区的垃圾回收等内容。
188 0
|
小程序 Android开发 iOS开发
在钉钉小程序中安卓无法打开webview
在钉钉小程序中安卓无法打开webview
432 1