2013-03-27 113 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