当前位置: 首页 > 面试题库 >

如何避免回调中的内存泄漏?

赵志
2023-03-14
问题内容

有效的Java说:

内存泄漏的第三个常见来源是侦听器和其他回调。如果在客户端注册回调但未显式注销的情况下实现API,除非您采取某些措施,否则它们会累积。确保回调被及时垃圾回收的最佳方法是仅存储对其的弱引用,例如,通过仅将它们作为键存储在WeakHashMap中。

我是Java的初学者。有人可以教我如何在回调中创建弱引用,并告诉我它们如何解决内存泄漏问题吗?谢谢。


问题答案:

阅读这篇文章

关键要点是:

您可以将直接引用视为强大的引用,不需要额外的代码即可创建或访问该对象。其余三种引用类型是在java.lang.ref包中找到的Reference类的子类。软引用由SoftReference类提供,弱引用由WeakReference类提供,幻像引用由PhantomReference提供。

软引用的作用类似于数据缓存。当系统内存不足时,垃圾收集器可以任意释放唯一引用为软引用的对象。换句话说,如果没有对对象的强引用,则该对象是释放对象。垃圾收集器需要在释放OutOfMemoryException之前释放所有软引用。

弱引用比软引用弱。如果对对象的唯一引用是弱引用,则垃圾收集器可以随时回收对象使用的内存。不需要内存不足的情况。通常,对象使用的内存在垃圾收集器的下一个阶段中回收。

虚拟引用与清理任务有关。它们在垃圾回收器执行终结处理并释放对象之前立即提供通知。考虑它是在对象内执行清理任务的一种方法

其次是WeakListModel清单,我不会发布该清单以避免混淆此响应。



 类似资料:
  • 我读了很多关于如何避免Android内存泄漏的文章,但我仍然不太确定我是否做对了。 我的应用程序由一个活动组成 问题1:这够了吗? 让我困惑的是,你可以在网上找到一个经典的“不去”的例子(http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/): 我认为,一旦创建完成, 检索上下文,将其传递给手动创建的查看

  • 本文向大家介绍如何避免SAP B1 DI API中的内存泄漏,包括了如何避免SAP B1 DI API中的内存泄漏的使用技巧和注意事项,需要的朋友参考一下 经验法则是这样的,如果实例化DI API对象,则必须释放它。如果不明确释放它,则将导致内存泄漏。 您可以使用ReleaseComObject方法来释放对象内存。如果您尝试释放一个空对象,它将抛出异常。 因此,最好在尝试释放对象之前进行null检

  • 问题内容: 所以我有这个C ++程序,它是通过Java程序中的JNI调用的,代码如下: 在倒数第二行中,从不释放而是返回,是否会导致最终的内存泄漏?反正有解决这个问题的方法吗? 还有可能不是返回字符串而是返回布尔值(由LogonUser函数返回),而不是jstring,而是添加了要在方法中传递的“ errormessage”引用,并更新了它?我的Java程序能否看到“ errormessage”的

  • 本文向大家介绍避免 Android中Context引起的内存泄露,包括了避免 Android中Context引起的内存泄露的使用技巧和注意事项,需要的朋友参考一下 Context是我们在编写Android程序经常使用到的对象,意思为上下文对象。 常用的有Activity的Context还是有Application的Context。Activity用来展示活动界面,包含了很多的视图,而视图又含有图片

  • 我是android开发的新手,我刚刚从以下链接读到了Romain Guy的“避免android内存泄漏” http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/ 然后我在我的android模拟器上用他著名的代码片段做了一个小测试 此代码应该在更改方向时泄漏第一个活动上下文。因此,我在emulator中运行了

  • 本文向大家介绍如何避免回调地狱?相关面试题,主要包含被问及如何避免回调地狱?时的应答技巧和注意事项,需要的朋友参考一下 你可以有以下方式避免回调地狱 模块化:将回调函数转换为独立的函数 使用流程控制库,例如[aync] 使用Promise 使用aync/await 使用来计算生成器或Promise 解析:这个问题有很多种答案,取决你使用的场景,例如ES6, ES7,或者一些控制流库。