当前位置: 首页 > 知识库问答 >
问题:

泄漏金丝雀,再循环器查看泄漏的马达

魏学智
2023-03-14

我决定是时候学习如何使用泄漏金丝雀来检测我的应用程序中的泄漏了,就像我一直做的那样,我尝试在我的项目中实现它,以真正了解如何使用该工具。实现它很容易,困难的部分是阅读工具向我扔回来的东西。我有一个scrollview,当我上下滚动时,它似乎在内存管理器中积累内存(即使它没有加载任何新数据),因此我认为这是跟踪泄漏的一个很好的候选对象,结果如下:

它看起来像v7。小装置。RecyclerView正在泄漏适配器,而不是我的应用程序。但那不可能是对的。。。。正当

下面是适配器和使用它的类的代码:https://gist.github.com/feresr/a53c7b68145d6414c40ec70b3b842f1e

我开始悬赏这个问题,因为两年后它在一个完全不同的应用程序上重新出现

共有3个答案

章禄
2023-03-14

首先,我引用了这个文件。

它看起来像v7。小装置。RecyclerView正在泄漏适配器,而不是我的应用程序。但那不可能是对的。。。。正当

实际上是您的适配器泄漏了RecycraView(跟踪图和LeakCanary活动的标题非常清楚)。然而,我不确定它是“父”回收视图还是HourlyViewHolder中的嵌套视图,或者两者兼而有之。我认为罪魁祸首是你的观众。通过使它们成为非静态的内部类,您显式地为它们提供了对封闭适配器类的引用,并且这几乎直接将适配器与回收的视图耦合在一起,因为持有者中每个itemView的父级都是回收视图本身。

我的第一个解决这个问题的建议是通过使ViewHolder和Adapter成为静态内部类来解耦它们。这样,它们就不会持有对适配器的引用,因此它们将无法访问您的上下文字段,这也是一件好事,因为上下文引用的传递和存储应该尽量少(也是为了避免大内存泄漏)。当您只需要上下文来获取字符串时,可以在其他地方进行,例如在适配器构造函数中,但不要将上下文存储为成员。最后,dayForecasAdapter似乎也很危险:您将一个相同的实例传递给每个HourlyViewHolder,这似乎是一个bug。

我认为修复设计和解耦这些类应该摆脱内存泄漏

单于善
2023-03-14

我能够解决这个问题,通过重写回收视图。之所以发生这种情况,是因为RecyclerView从不从AdapterDataViable中注销自己。

@Override protected void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    if (getAdapter() != null) {
        setAdapter(null);
    }
}
桂阳文
2023-03-14

如果适配器的寿命比RecycraView长,则必须清除onDestRoyView中的适配器引用:

@Override
public void onDestroyView() {
    recyclerView.setAdapter(null);
    super.onDestroyView();
}

否则,适配器将保存对RecycraView的引用,该引用应该已经内存溢出。

如果屏幕涉及过渡动画,您实际上必须进一步执行此操作,并且仅在视图分离时清除适配器:

@Override
public void onDestroyView() {
    recyclerView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
        @Override
        public void onViewAttachedToWindow(View v) {
            // no-op
        }

        @Override
        public void onViewDetachedFromWindow(View v) {
            recyclerView.setAdapter(null);
        }
    });
    super.onDestroyView();
}
 类似资料:
  • 问题内容: 我认为我的android应用正在泄漏内存。我不是绝对确定这是问题所在。 应用程序打开时经常崩溃,并且logcat尝试加载位图图像时会显示“内存不足”异常。 崩溃后,我重新打开了该应用程序,它运行正常。Logcat会显示许多“ gc”,并且JIT表会不时地向上调整大小,而不会向下调整,直到应用程序因内存不足错误而崩溃。 这听起来像是内存泄漏吗?如果是这样,我该如何定位和关闭泄漏点。 这是

  • 在使用节点流时,我注意到几乎每个教程都教授如下内容: 但在我看来,这是一段相当危险的代码。如果文件流在某个点抛出异常,会发生什么?我认为文件流可能会泄漏内存,因为根据文档,文件流显然没有关闭。 我应该在乎吗?在我看来node.js流应该处理情况...

  • 问题内容: 我一直在追寻内存泄漏(由“ valgrind –leak-check = yes”报告),它似乎来自ALSA。这段代码已经存在于自由世界中一段时间​​了,所以我猜这是我做错的事情。 输出看起来像这样: 并继续一些页面 这是由于我在一个项目中使用ALSA并开始看到这种巨大的泄漏……或者至少是所说泄漏的报告。 所以问题是:是我,ALSA或valgrind在这里遇到问题吗? 问题答案: ht

  • 问题内容: 我有一个长时间运行的脚本,如果让脚本运行足够长的时间,它将消耗系统上的所有内存。 在不详细介绍脚本的情况下,我有两个问题: 是否有可遵循的“最佳实践”,以防止泄漏发生? 有什么技术可以调试Python中的内存泄漏? 问题答案: 看看这篇文章:跟踪python内存泄漏 另外,请注意,垃圾收集模块实际上可以设置调试标志。看一下功能。此外,请查看Gnibbler的这段代码,以确定调用后已创建

  • 本文向大家介绍Java 内存泄漏,包括了Java 内存泄漏的使用技巧和注意事项,需要的朋友参考一下 在Java中,垃圾回收(析构函数的工作)是使用垃圾回收自动完成的。但是,如果代码中有引用它们的对象怎么办?它无法取消分配,即无法清除其内存。如果这种情况一再发生,并且创建或引用的对象根本没有被使用,它们就会变得无用。这就是所谓的内存泄漏。 如果超过了内存限制,则程序将通过抛出错误(即“ OutOfM

  • 问题内容: 我使用Informix遇到了一个奇怪的问题(具体来说,我使用的是IBM.Data.Informix命名空间,即4.10 Client SDK)。我正在使用ODBC连接到IBM Informix数据库,并且遇到内存泄漏问题。该文档相当稀疏,并且我只能使用当前安装的驱动程序/ SDK。这是我用于数据库上下文的代码: } 我已尝试处置并关闭所有可以的连接,但这似乎无济于事。我是否缺少某些东西