【问题标题】:Android Memory Leak, EMA Suspect: "byte[]" loaded by "<system class loader>"Android 内存泄漏,EMA 嫌疑人:“byte[]”由“<system class loader>”加载
【发布时间】:2016-06-26 21:18:26
【问题描述】:

我正在编写一个小型单活动 android 应用程序并遇到内存泄漏错误,因为我找不到来源。 首先,应用程序计算基本的东西并以结构化的方式显示结果。计算很简单,虽然有一些图像,但它们大约有 50 个图标,总共不到 4MB。

我已经安装了 Eclipse 内存分析器并用它检查了堆转储,泄漏嫌疑人报告说:

问题嫌疑人1: 加载的“byte[]”的 477 个实例占用 78.116.240 (76,46%) 个字节。

支配树

我不知道那些字节数组可能是什么,也看不到 GC Roots 或任何东西,因为这些数组在支配树中没有父母。我不经常为 Android 编程,我拼命想弄清楚,从今天起这里发生了什么。当我使用该应用程序并观察 ADM 中的堆大小/使用百分比时,我直接从 80% 的使用率开始,并且随着我的使用而变得更大。 (还显示 1 字节数组 (byte[], boolean[]))直到应用程序在 AVD 上崩溃,我的真实设备可以处理更长的时间。我知道我可以将尺寸变大,但这对我来说不是解决方案,因为我认为我从一开始就遇到了这个问题,现在它已经到了临界点。

【问题讨论】:

  • 我自己也面临一个非常相似的问题。具有所有字节数组的支配树和 GC 根的路径是单字节数组本身。不是很有帮助

标签: java android arrays memory-leaks byte


【解决方案1】:

转到直方图视图:直方图视图显示可按实例数量、浅堆(所有实例使用的内存总量)或保留堆(保持活动的内存总量)排序的类列表所有实例,包括它们引用的其他对象)。

右键单击 byte[] 类并选择 List Objects > 传入引用。这会生成堆中所有字节数组的列表,您可以根据浅堆使用情况对其进行排序。

选择一个大对象,然后向下钻取。这将向您显示从根集到对象的路径——使该对象保持活动状态的引用链。在下面的情况下,位图缓存是罪魁祸首

旁注 从 Android 3.0 (Honeycomb) 开始,Bitmap 对象的像素数据存储在字节数组中(以前不存储在 Dalvik 堆中)

【讨论】:

    猜你喜欢
    • 2017-06-25
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多