2013-04-16 112 views
0

這發生在使用Android 4.0.2平臺的自定義版本的嵌入式系統上。我看到我們的一個android活動應用增長到400MB左右(當調用「ps」時rss大小)並被Linux OOM殺手殺死。 android平臺的最大堆大小設置爲62M。我無法理解Dalvik VM如何讓活動增長到400MB。Linux內存不足導致我的Android應用程序死機

當堆到60MB左右時,應用程序不應該得到Java內存異常嗎? 我們在logcat日誌或anr跟蹤中看不到這些Java異常。

我們實現了一個樣本活動,它按順序分配字節數組,並將每個字節設置爲一個虛擬值。當活動分配大約60MB時,我們確實會看到Outofmemory異常。

Android中是否有分配路徑不會被計算爲堆預算? 該活動呈現從網站下載的位圖PNG。

下面是我們平臺上的「getprop」結果。

$ adb shell getprop | grep -i堆

我很欣賞任何指針。

感謝

編輯: 注: 以下是ps的輸出。 Pss和Uss大約在316M以上。在本機代碼

 
          PID  Vss  Rss  Pss Uss cmdline 
logcat: hd[0]: pexecd(65): 982 351512K 351316K 326300K 316632K mytest.home^M 
logcat: hd[0]: pexecd(65): 660 679916K 61044K 57200K 56952K ./videngine^M 

RAM: 741764K total, 20320K free, 2148K buffers, 80104K cached, 24964K shmem, 10368K slab 

回答

2

直接撥款不計入該Java堆總。還可能有其他可能性(可能是從文件映射和填充頁面?)。

如果您有自定義的android版本,您可以設置OOM殺手值來保留您自己的應用程序。

+0

這是簡單的android應用程序沒有任何自定義JNI的東西。我希望JVM拋出OOM異常,而不是讓進程增長到400MB。 – videoguy

+0

它可能不是自定義的(實際上我曾想過 - 也許是錯誤的 - 它甚至不是你的應用程序),但它有什麼作用?平臺代碼中有很多JNI。 –

+0

這個應用程序使用android web瀏覽器控件加載一個網頁。看起來Webkit引擎在基於正在下載的頁面的Android Java堆以外的本地代碼中執行大量分配。這解釋了爲什麼該應用程序增長到300MB +。 – videoguy

2

我看到我們的Android活動的應用程序周圍的400MB增長到之一(在 「PS」 被調用RSS大小)

引述戴安娜Hackborn,關於ps Android上的輸出:「在VSS和Rss列基本上是噪聲(這些是一個進程的直接地址空間和RAM使用情況,如果你在整個進程中加起來的RAM使用量會得到一個可笑的大數字)「

我會衷心鼓勵你閱讀her epic SO answer on measuring an app's memory footprint。值得注意的是,除了上面引用的引用外,Rss在她的分析中沒有任何作用。因此,我建議不要擔心Rss,並關注其他指標。

+0

我要去看看線程。感謝分享。這就是我在「ps」調用時看到的。 logcat的:HD [0]:pexecd(65):982 351512K 351316K 326300K 316632K mytest.home^M logcat的:HD [0]:pexecd(65):660 679916K 61044K 57200K 56952K ./native_engine^M ... – videoguy

1

下面是你可以做什麼來了解你的應用程序使用什麼內存。 HPROF

下一頁使用在androir-SDK的HPROF-CONV工具轉換HPROF在android系統格式定期HPROF格式:

轉至DDMS,並通過點擊看起來像這樣的圖標來創建一個堆轉儲/工具文件夾。

接下來,用Eclipse Memory Analyser(MAT)打開堆轉儲,並查看支配樹,在那裏您將看到應用程序強制Dalvik垃圾收集器(GC)保留的變量列表。右鍵單擊它們並轉到「路徑GC根目錄」和「排除弱引用」,將顯示使這些對象保持活動狀態的引用。看看是否有任何過期的引用被保留爲內存泄漏。

您可以在0123應用程序中查看this video以查找內存泄漏的詳細方法。

+0

感謝您的信息和鏈接。我們要解決內存泄漏問題。讓我困擾的是爲什麼Dalvik運行時沒有拋出任何OutOfMemory異常。 – videoguy

+1

並非所有的東西都在Dalvik堆上分配,各種事情都會變得更大,並且它們可能反映在應用程序內存中(例如設置下正在運行的應用程序選項卡),例如JIT或其他。我真的很推薦從I/O看視頻,它詳細解釋了堆上發生了什麼,以及outOfMem Exp如何拋出。 – wangyif2

相關問題