0

这发生在使用 Android 4.0.2 平台的自定义构建的嵌入式系统上。我看到我们的一个 android 活动应用程序增长到大约 400MB(调用“ps”时的 rss 大小)并被 Linux OOM 杀手杀死。android 平台配置为最大堆大小设置为 62M。我不知道 Dalvik VM 如何让活动增长到 400MB。

当堆达到大约 60MB 时,应用程序不应该让 Java 出现内存不足异常吗?我们在 logcat 日志或 anr 跟踪中看不到这些 Java 异常。

我们实现了一个示例活动,它按顺序分配字节数组并将每个字节设置为一个虚拟值。当活动分配大约 60MB 时,我们确实看到内存不足异常。

android中是否有不计入堆预算的分配路径?该活动呈现从网站下载的位图 png。

以下是我们平台上的“getprop”结果。

$ adb shell getprop | grep -i 堆

我很感激任何指示。

谢谢

编辑:注意:下面是 ps 输出。Pss 和 Uss 大约是 316M,远远高于。

                             PID Vss Rss Pss Uss cmdline
logcat: hd[0]: pexecd(65): 982 351512K 351316K 326300K 316632K mytest.home^M
logcat: hd[0]: pexecd(65): 660 679916K 61044K 57200K 56952K ./videngine^M

RAM:总共 741764K,20320K 空闲,2148K 缓冲区,80104K 缓存,24964K shmem,10368K 平板
4

3 回答 3

2

本机代码中的直接分配不计入 Java 堆总数。可能还有其他可能性(可能是从文件映射和填充的页面?)。

如果你有一个自定义的 android 版本,你可以设置 OOM 杀手值来保留你自己的应用程序。

于 2013-04-16T21:39:38.903 回答
2

我看到我们的一个 android 活动应用程序增长到大约 400MB(调用“ps”时的 rss 大小)

引用 Dianne Hackborn,关于psAndroid 上的输出:“Vss 和 Rss 列基本上是噪音(这些是直接的地址空间和进程的 RAM 使用量,如果你将跨进程的 RAM 使用量相加,你会得到一个数量多得离谱)”

我衷心鼓励您阅读她关于测量应用程序内存占用的史诗般的 SO 答案。值得注意的是,除了我上面引用的引用之外,Rss 在她的分析中没有任何作用。因此,我建议不要担心 Rss 并关注其他指标。

于 2013-04-16T22:11:30.247 回答
1

您可以通过以下方式了解您的应用程序正在使用什么内存。

转到 DDMS,并通过单击如下所示的图标创建堆转储: HPROF

接下来使用 androir-sdk/tools 文件夹中的 hprof-conv 工具将 android 格式的 HPROF 转换为常规 HPROF 格式。

接下来,使用Eclipse Memory Analyzer (MAT)打开堆转储,并查看支配树,在那里您将看到您的应用程序强制 Dalvik 垃圾收集器 (GC) 保留的变量列表。右键单击它们并转到“Path the GC root”和“Exclude Weak References”,将显示使这些对象保持活动状态的引用。查看是否有任何过期的引用被保留为内存泄漏。

您可以观看此视频,了解在 Android 应用程序中查找内存泄漏的详细方法。

于 2013-04-17T00:08:32.350 回答