這發生在使用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
這是簡單的android應用程序沒有任何自定義JNI的東西。我希望JVM拋出OOM異常,而不是讓進程增長到400MB。 – videoguy
它可能不是自定義的(實際上我曾想過 - 也許是錯誤的 - 它甚至不是你的應用程序),但它有什麼作用?平臺代碼中有很多JNI。 –
這個應用程序使用android web瀏覽器控件加載一個網頁。看起來Webkit引擎在基於正在下載的頁面的Android Java堆以外的本地代碼中執行大量分配。這解釋了爲什麼該應用程序增長到300MB +。 – videoguy