2013-03-27 171 views
0

我有一个应用程序与arduino进行通信,它运行netty实例来控制arduino。问题是我没有用完内存,但根据adb logcat,使用堆大小的总堆大小太低。我总是在%10免费附近,所以对netty服务器的任何请求都会触发gc,此时我会得到一堆的,Android没有足够的堆分配

D/dalvikvm(2862): WAIT_FOR_CONCURRENT_GC blocked 189ms 

甚至简单的请求,什么都不做(至少我)在gc暂停至少失去了一秒。我有

android:largeHeap="true" 

集我的清单和仿真器件具有512 MB VM堆,但是它并不接近这个数字的任何地方分配(它是围绕10MB分配)。我没有内存泄漏,因为10%空闲是稳定的,它变化为+/- 2-3%。即使在有2个RAM的电话上(所有其他应用程序关闭),我总是运行少于2个3 MB的免费堆是否有解决方法?

+0

从此[link](http://stackoverflow.com/questions/2630158/detect-application-heap-size-in-android)阅读代码来监视您的实际内存使用情况。 – minhaz 2013-03-27 01:31:38

+0

已经做到了,那是我如何计算自由堆空间。 – 2013-03-27 01:42:19

回答

1

设备RAM的大小并不重要,因为具有2 GB的RAM并不意味着您会得到2GB的堆。

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

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

为了获得更大的堆,你可以做的不多,但是你可以使用NDK重写你的应用,因为你在dalvik虚拟机之外运行堆大小并不重要,因此可以使用(几乎)所有设备的RAM,如果需要的话。

但是,使用10%的堆空间运行并不差。

+1

大堆工程我在手机上获得最大256 MB,但它不让我使用它(分配10-11)我一直在等待gc。 – 2013-03-27 01:44:59

+0

不到16MB是非标准的,你并不需要支持它,但它可能发生在不寻常的情况下(例如,CyanogenMod Android版本允许用户直接配置堆大小,直到我认为12MB)。这是一个用户操作和IMO,如果一个应用程序无法以12MB运行,那么这是用户的问题,但有些用户可能不会以这种方式看到它,并且用户会写评分! :-) – Carl 2013-05-29 13:29:04

+0

我的Nexus 4: 03-30 11:14:12.954:D/dalvikvm(1572):GC_CONCURRENT释放314K,6%免费9851K/10424K,暂停3ms + 6ms,总共33ms 因此,初始堆大小为只有10M(10424K).... 我不知道为什么会发生这种情况。 getMemoryClass()返回192 – HackNone 2015-03-30 07:08:29