问题标签 [android-memory]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1355 浏览

android - 与 Bitmap 使用相关的 Android Fragments 内存泄漏

我正在尝试创建一些相册应用程序。但是在创建新的 Fragment 时,旧的 Fragment 会留下来,并且它包含的 Bitmaps 会迅速填满我的内存,从而导致内存不足错误。

这是我正在尝试做的事情:

假设我有 3 个类别。婚纱照、暑假等。单击每个类别后,我想在其旁边的片段中显示照片。

对于主视图,我使用 MasterDetailFlow 模板中的 FragmentActivity(当您在 Eclipse 中创建新的 Android 项目时)。所以基本上它有一个带有 listView 的片段(这里是我的类别)和 framelayout 来放置我的另一个片段。

因为我想为图片创建 ViewPager,所以我创建了 Fragment

在框架布局内(在 Activity onItemSelected :) 中:

这个片段基本上只是用来设置:

另一方面,适配器在 getItem 方法中创建新的 PictureFragment。

PictureFragment 使用 BitmapFactory 和 LruCache 来获取图片。我将 WeakReference 存储到 PictureFragment 和 onDestroyView() 中的位图我调用:

现在来解决问题。在一个 PagerFragment 中看起来一切正常。图片片段被创建和销毁。记忆似乎得到了控制。但是当我单击其他列表元素上的活动时,问题就开始了。我可以在日志中看到正在为 pager View 创建两个新片段,我可以看到在 PagerFragment 上调用了 onDestroyView() 方法,但在 PictureFragment 上没有调用方法,我认为这会导致位图未被回收。因此内存不足错误。那么我做错了什么?如何去除里面的PicturesFragment和位图?

感谢帮助

W

0 投票
2 回答
3160 浏览

android - 在 Android 中加载位图时出现内存不足问题

我正在使用 Fedor 的代码(https://github.com/thest1/LazyList)来加载位图。根据我的要求,我修改了几行代码。每当堆内存超过阈值时,我就会出现内存不足错误。在同一主题上发布了各种问题。他们中的大多数人建议使用 SoftReference 和位图 recycle()。我正在使用 SoftReference,但我仍然面临问题。而且我对在哪里使用位图回收方法感到困惑。

MemoryCache.java

ImageLoader.java

附上 Logcat 输出:

0 投票
1 回答
2635 浏览

android - 调用 finish() 不会清除对 Activity 的内存引用

在我的应用程序的简化版本中,我有两个活动,A 和 B。活动 A 启动 B,在完成一些工作后 B 调用完成()。在大多数设备上使用内存分析器工具(运行 4.2 的 Galaxy Nexus、运行 4.0.4 的 Droid 4 和运行 2.3.4 的 Droid 2)显示没有活动 B 的痕迹,这正是我的预期。

但是在运行 4.1.1 的三星 S3 上,MAT 显示活动 B 对象仍然存在,这是由于到以下 GC 根的路径(不包括弱/软引用):

每次我启动和停止活动 B 时,MAT 都会显示活动 B 的内存占用的另一个实例。我打开/关闭活动 B 的次数越多,logcat 中报告的内存占用就越大。通过 MAT 强制 GC 不会删除对活动 B 内存的引用。

我有三个问题。

  1. 为什么不同设备的内存/GC行为不同?

  2. 在 S3 上,操作系统最终会回来并 GC 搁浅的活动 B 对象(换句话说,我应该不用担心它,因为 Android 会在崩溃前清理它)?

  3. 如果不是,那么 Thread 和 AudioManager 引用来自哪里,我将如何清除它们?

感谢任何有经验的“泄密者”!

0 投票
1 回答
122 浏览

android - 关于android应用程序的内存大小

嘿,我使用phone-gap框架开发了一个android应用程序。.apk 文件的内存大小为 350 kb。安装后,应用程序使用的内存为 2.00 mb。我想在安装后减少内存的使用,实际上这是要求。在浏览 Google 时,我研究了图像,而图像只有所需的像素。有没有其他方法可以减少应用程序的内存大小....在此先感谢。

0 投票
1 回答
445 浏览

android - 使用大部分堆的 Android 应用程序,没有成功识别内存泄漏

我有一个相对轻量级的应用程序,它似乎正在使用大部分堆内存(在我看来),并且在垃圾收集后它不会缩小。

通过使用 Eclipse 内存分析器,我无法识别任何内存泄漏。我对这个工具的了解虽然非常有限。

来自 LogCat 的片段:

(请注意,这只是日志转储中的一小部分。无论我在应用程序中做什么,LogCat 似乎都会持续输出垃圾收集消息。不过,可用堆的数量保持相对稳定,这表明(对我而言)没有实际的内存泄漏?)

以上是“大量使用”的结果,涉及在按钮上发送垃圾邮件和多次更改方向。我担心的是只有大约 10% 的堆似乎是空闲的/留下来进行进一步的扩展。

供您参考,表示当前片段布局的 XML 文件(在上述输出时)是一个内部带有 TableLayout 的 ScrollView,由大约 25 个 TableRow 元素组成,也许这就是如此大的堆内存占用的原因?

这有什么好担心的吗?

如果您喜欢查看我的一些代码,请告诉我。提前致谢。

更新:

该应用程序基本上只是一个包含两个片段的 Activity。基于用户交互,所述片段之一与其他片段交换。将其视为典型的菜单内容应用程序(如默认的 Android 联系人应用程序)。左侧的 MenuFragment(联系人列表)和右侧的一些 ContentFragment(联系人详细信息)。到目前为止,除了设置 UI 行为之外,还没有涉及太多功能。后台没有发生任何事情,也没有保存状态或类似情况。我基本上专注于确保当我从 MenuFragment 中选择一个项目时显示正确的片段,当片段启动时绘制正确的布局,并且当用户按下后退按钮时显示正确的片段。

0 投票
1 回答
1405 浏览

android - 重新创建片段时自定义处理程序中的内存泄漏

以下是Fragment我用来显示简单秒表的精简版。该应用程序在平板电脑上运行良好。但是,在手机上,方向变化会导致在新活动中重新创建片段,我遇到了内存泄漏。

Eclipse MAT 甚至给了我这个:

但是,当我在平板电脑上运行时分析内存时,上述内容不会出现(始终单一活动)。

关于如何解决这个问题的任何想法?如果我正确理解了这个问题,我可能不会,我认为当手机上发生方向变化时会创建多个处理程序。

如果我的问题难以理解,请给我一个提示,我会尝试更好地解释。

0 投票
2 回答
162 浏览

android - 如果我没有在 Android 中实现覆盖方法会发生什么?

我正在开发一个 Android 应用程序,并且我已经阅读了有关活动生命周期的信息。我不知道,如果我不实现生命周期onCreate()、onDestroy()等方法会发生什么。JVM 会自动调用这些方法吗?我习惯于使用 iOS,而对 Java 的更改对我来说有些特殊。我想调用方法来管理内存。我认为这些方法有助于管理我的应用程序中的内存,并且不会在运行时崩溃。

0 投票
1 回答
136 浏览

android - 如何检索可用的系统内存和电池电量

我目前正在开发一个我真的需要帮助的应用程序,并且我已经到了需要一些帮助的阶段。好的,所以我正在尝试获取可用系统内存/Ram 的数量和设备的电池电量,我想在我的应用程序活动中显示它们。

这是我到目前为止所拥有的。

0 投票
2 回答
331 浏览

android - 在 onPause() 方法中调用 GC 是一种好习惯吗?

显式调用 GC 是否会对系统内存产生影响?

我在我的活动中使用了许多数据结构,例如ArraylistHashMap。每次用户加载活动时,都需要重新填充来自 Web 服务的更新数据。这意味着当用户离开活动并再次回来时,这些数据结构应该进入内存。

当用户离开活动并且不再访问它时,我不希望这些数据结构占用任何内存。

那么可以通过在onPause()活动中调用GC来执行吗?这样做是个好习惯吗?如果我想做这样的事情,有哪些选择?

0 投票
3 回答
1533 浏览

android - Android:文件读取 - OutOfMemory 问题

我正在创建一个涉及从文件中读取数据的应用程序。该文件相对较大 (1.8 MB),正在从 onCreate 中的异步线程读取。应用程序第一次启动时,它加载得很好。但是,如果单击后退按钮然后再次加载它,它会耗尽内存并崩溃(抛出 OutOfMemory 错误)。

如何让它使用尽可能少的内存和/或在完成后释放该内存?

文件读取代码(在doInBackground()异步类的方法中执行):

编辑*异步类:

我曾尝试根据我想如何组织数据并将每个文本文件中的数据存储到单独的文件中来拆分文件,ArrayList但我也遇到了内存问题。我还将所有数据存储到一个“主”ArrayList中,然后在该“主”上调用一个方法将数据添加到适当的位置ArrayList(一旦复制,就从“主”中删除/清除数据)。

关于如何简化和减少内存影响的任何想法?

编辑**

日志猫:

在此处输入图像描述

那是从您单击后退按钮然后再次加载活动时开始的。以下只是生成的消息之一(详细):

在此处输入图像描述