为什么我的应用程序比其他应用程序拥有更少的堆内存?

问题描述:

我的问题可能看起来很天真,但我不知道如何更正确地制定它。问题是我在我的应用程序中创建并使用了大型简单类型的数组。我得到这样的错误:为什么我的应用程序比其他应用程序拥有更少的堆内存?

ERROR/dalvikvm-heap(1763): Out of memory on a 7907344-byte allocation. 

是的,它是足够大的,但任务管理工具,声称我的应用程序正在使用的内存只有30MB,而其他在同一时间使用50MB甚至110MB(见过一次)和系统中还有190MB的空闲内存(不是系统应用程序,就是我安装的其他普通应用程序)。如果所有应用程序在启动时都提供相同的堆大小,它们会如何变大?

+7

可能是一个寻找足够大的连续记忆药水的问题。 – Anthony 2010-11-18 16:01:46

+0

为什么你想首先分配这么多?让我猜猜:没有缓冲流 – apps 2010-11-18 19:33:44

+0

我用它在Canvas上绘制位图。原因在于位图是由JNI访问的本地代码生成和不断更改的。 – 2010-11-21 18:40:40

Android应用程序的最大堆大小取决于它所运行的设备。对于早期的设备,最大堆大小为16MB,但对于一些较晚的设备,它可以是24MB甚至32MB。

这是Dalvik VM在每个设备上的属性,不是您可以更改的内容(无需从源重建Android)。

您可以使用ActivityManager.getMemoryClass()来查询“每应用程序内存类”,这似乎是一个与堆大小不完全无关的数字。

应用程序可以使用不在堆上的内存,但100 + MB似乎是一个惊人的大数目。

如果你想了解分析Android上的内存使用情况,你不可能比this Stack Overflow answer by Dianne Hackborn更好,他是Google的Android开发人员之一。简而言之,它说分析内存使用是非常困难的,你应该采取任何数字你有一撮盐。

您是否尝试配置堆大小?使用以下选项来执行此操作。

-Xms设定的初始Java堆大小 -Xmx设置最大Java堆大小

为了获得更多的帮助运行的java -X

例如:java -Xms20m -Xmx100m -cp。 MyMain

祝你好运。

我们都知道java有默认的垃圾收集器系统,但是在某个层次上我们需要清除或刷新一些对象。

而且您还可以为JVM设置或配置堆大小。