【问题标题】:Android Not Enough Heap AllocatedAndroid 没有分配足够的堆
【发布时间】:2013-03-27 01:11:15
【问题描述】:

我有一个与 arduino 通信的应用程序,它运行一个 netty 实例来控制 arduino。问题是我没有用完内存,但是根据 adb logcat,总堆大小与使用的堆大小相比太低了我总是在 %10 左右空闲,所以对 netty 服务器的任何请求都会触发 gc,此时我得到了一堆的,

D/dalvikvm( 2862): WAIT_FOR_CONCURRENT_GC blocked 189ms

即使是不做任何事情的简单请求(至少对我而言)也会在 gc 暂停时损失至少一秒钟。我有

android:largeHeap="true"

在我的清单中设置,模拟器设备的 VM 堆为 512 mb,但它没有分配接近该数字的任何地方(它分配了大约 10MB)。我没有内存泄漏,因为 10% 的空闲是稳定的,它会 +/- 2-3%。即使在具有 2 gigs ram 的手机上(所有其他应用程序都已关闭),我也总是在运行时使用少于 2 3 MB 的可用堆,是否有解决方法?

【问题讨论】:

  • link 读取代码以监控您的实际内存使用情况。
  • 已经做了,我就是这样计算空闲堆空间的。

标签: android performance android-emulator garbage-collection


【解决方案1】:

设备 RAM 的大小并不重要,因为拥有 2 GB RAM 并不意味着您将获得 2GB 堆。

Google 在其建议中指定的最小堆大小为 16MB。你不会得到比这更小的堆。

largeHeap 仅适用于 Android 3.0 及以上版本,不保证更大的堆大小。

要获得更大的堆,您无能为力,但您可以使用 NDK 重写您的应用程序,其中堆大小无关紧要,因为您在 dalvik VM 之外运行,因此可以使用(几乎)如果需要,可以使用设备的所有 RAM。

但是,以 10% 的可用堆空间运行也不错。

【讨论】:

  • 大型堆工作我在手机上获得最大 256 MB 但它不允许我使用它(分配了 10-11)我一直在等待 gc。
  • 小于 16MB 是非标准的,你真的不必支持它,但它可能会发生在不寻常的情况下(例如,在 CyanogenMod Android 版本上,它允许用户直接向下配置堆大小我认为是 12MB)。这是用户操作,如果应用程序无法在 12MB 中运行,IMO 是用户的问题,但有些用户可能不这么看,用户会写评分! :-)
  • My Nexus 4: 03-30 11:14:12.954: D/dalvikvm(1572): GC_CONCURRENT freed 314K, 6% free 9851K/10424K, paused 3ms+6ms, total 33ms 所以初始堆大小只有10M(10424K)....我不知道为什么会发生这种情况。 getMemoryClass() 返回 192
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
相关资源
最近更新 更多