如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?

阅读:
Java的finalize():
https://blog.csdn.net/qq_32534441/article/details/83585359

    Java中的垃圾回收一般是在Java堆中进行,因为堆中几乎存放了Java中所有的对象实例。谈到Java堆中的垃圾回收,自然要谈到引用。在JDK1.2之前,Java中的引用定义很很纯粹:如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用。但在JDK1.2之后,Java对引用的概念进行了扩充,将其分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)四种,引用强度依次减弱。

  • 强引用:如“Object obj = new Object()”,这类引用是Java程序中最普遍的。只要强引用还存在,垃圾收集器就永远不会回收掉被引用的对象。
  • 软引用:它用来描述一些可能还有用,但并非必须的对象。在系统内存不够用时,这类引用关联的对象将被垃圾收集器回收。JDK1.2之后提供了SoftReference类来实现软引用。
  • 弱引用:它也是用来描述非需对象的,但它的强度比软引用更弱些,被弱引用关联的对象只能生存岛下一次垃圾收集发生之前。当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。在JDK1.2之后,提供了WeakReference类来实现弱引用。
  • 虚引用:最弱的一种引用关系,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的是希望能在这个对象被收集器回收时收到一个系统通知。JDK1.2之后提供了PhantomReference类来实现虚引用。

一旦垃圾回收器准备好释放对象占用的存储空间,首先会去调用finalize()方法
①进行一些必要的清理工作(对垃圾回收器不能处理的特殊情况进行处理)(例子在下边)
②也有可能使该对象重新被引用,我习惯叫这种作用为复活。注意!!每个对象的finalize()方法只能被执行一次,第二次就会直接跳过finalize()方法,这就是为了防止出现对象无限复活,内存空间只增不减。
一般忽略第二种情况,概念就变成了:一旦垃圾收集器准备好释放对象占用的存储空间(进入第一个回收周期),首先会去调用finalize()方法进行一些必要的清理工作,只有到下一次再进行垃圾回收动作(下一个回收周期)的时候,才会真正释放这个对象所占用的内存空间。

答:
不会立即释放对象占用的内存。 如果对象的引用被置为null,只是断开了当前线程栈帧中对该对象的引用关系,而 垃圾收集器是运行在后台的线程,只有当用户线程运行到安全点(safe point)或者安全区域才会扫描对象引用关系,扫描到对象没有被引用则会标记对象,这时候仍然不会立即释放该对象内存,因为有些对象是可恢复的(在 finalize方法中恢复引用 )。只有确定了对象无法恢复引用的时候才会清除对象内存。

在Unity中,释放内存通常不是主动去做的,因为Unity引擎内部有自动内存管理机制。然而,如果你需要手动释放一些资源以优化性能或避免内存泄漏,可以采取以下几种方法: 1. **强制卸载**:当你不再需要某个GameObject或Component时,应将其`Destroy()`掉。这通知Unity销毁相关的资源并释放内存。 ```csharp if (object != null) { Destroy(object); } ``` 2. **关闭引用**:如果是一些长期占用内存对象,例如大的Texture或AudioClip,可以在不再使用时设其为null,让垃圾收集器有机回收它。 ```csharp audioClip = null; // 释放AudioClip的引用 ``` 3. **Unloaded Scenes**:对于未加载的Scenes,其中的资源不立即被销毁,只有当它们从内存中完全移除时才释放。可以定期检查并卸载不再活跃的Scenes。 4. **避免循环引用**:在脚本之间避免形成无限引用链,这可能导致内存泄露。可以使用弱引用(WeakReference)或者在不再需要时解除引用。 5. **使用Object Pool**:对于频繁创建和销毁的小对象,比如粒子系统发射器,使用Object Pool可以帮助复用对象,而不是每次创建新的。 6. **使用Unity Profiler检查内存**:官方的Profiler工具可以帮助检测内存泄漏的位,通过Memory Profiler模块查看内存使用情况。 记住,除非遇到明确的内存问题,否则大部分情况下不需要担心手动释放内存,Unity引擎负责大部分内存管理。不过,了解如何正确操作有助于更好地理解和调试代码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值