【问题标题】:Why my application has less heap memory than others?为什么我的应用程序的堆内存比其他应用程序少?
【发布时间】:2010-11-18 15:58:03
【问题描述】:

我的问题可能看起来很幼稚,但我不知道如何更正确地表述它。问题是我在我的应用程序中创建和使用大型简单类型数组。我收到如下错误:

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

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

【问题讨论】:

  • 可能是找到足够大的连续内存的问题。
  • 一开始为什么要分配这么多?让我猜猜:不是缓冲流
  • 我用它在 Canvas 上绘制位图。原因是位图是在 JNI 访问的本机代码中生成并不断变化的。

标签: java android memory-management


【解决方案1】:

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

这是每个设备上 Dalvik VM 的属性,您无法更改(无需从源代码重建 Android)。

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

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

如果您想了解如何分析 Android 上的内存使用情况,最好的方法就是 this Stack Overflow answer by Dianne Hackborn,他是 Google 的 Android 开发人员之一。简而言之,它说分析内存使用情况非常困难,您应该对任何数据持怀疑态度。

【讨论】:

    【解决方案2】:

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

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

    要获得更多帮助,请运行 java -X

    示例:java -Xms20m -xMX100m -cp 。我的主要

    祝你好运。

    【讨论】:

      【解决方案3】:

      我们都知道java默认有垃圾收集系统,但在某种程度上我们需要清除或刷新一些对象。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-01
        • 2011-08-26
        • 2012-06-05
        • 2012-03-25
        • 1970-01-01
        • 2015-05-13
        相关资源
        最近更新 更多