2014-04-01 126 views
5

我們安裝了Android硬件/軟件組合,我們在客戶端安裝。Android內存不足,原因不明顯

在某些平板電腦上,內存開始不足,Android開始通過殺死我們的應用程序來實現它的功能,然後我們的看門狗服務自動重新啓動它。

這裏是我們用來監視per-app memory usage代碼:

for(RunningAppProcessInfo info : am.getRunningAppProcesses()) {  
     int memused = am.getProcessMemoryInfo(
         new int[]{info.pid})[0].getTotalPss(); 

     Log.log(DIAG_INFO, "Process Mem: " + info.processName, memused); 
    } 

這裏是可以讓我們overall system memory levels

  MemoryInfo mi = new MemoryInfo(); 
     am.getMemoryInfo(mi); 
     long availableMegs = mi.availMem/1048576L; 
     long threshold = mi.threshold /1048576L; 

availableMegs下降到接近threshold(64MB在我們的情況下)的代碼和android開始殺死東西。

但是,當我們看每個進程的內存使用情況時,加上TotalPss值,我們得到一個正常的總數。沒有任何失控的記憶方式!

任何想法,失蹤的RAM已經走了?

+0

你要的某些種類,你們可能會丟失數據庫/ Web Service的任何打開的連接? – ksudu94

+2

我認爲總的PSS值只是給你用戶空間內存使用量(活動管理器可以訪問的所有用戶空間進程)。內存總量是內核+驅動程序+用戶進程。 am.getMemoryInfo()從/ proc/meminfo獲取相對準確的系統內存使用情況。這些標籤上的某些內容可能實際上是錯誤的。只是一個想法!! – digitizedx

+1

我假設'getRunningAppProcesses()'可能不會返回內核或其他系統級別的內存使用情況。可能只在應用程序/達爾維克級別上。 – minhaz

回答

4

您是否使用過外部工具,如Eclipse Memory Analyzer(MAT)?它可能會給你一個比你的應用內測量更好的視角。這並不難,但需要一些設置。其用法爲Here's a pretty good write-up

在設備上的所有應用程序中報告內存的解決方案都在Eclipse系統信息視圖中。要使用它,請打開DDMS透視圖並在Devices視圖中選擇一個設備。然後打開System Information視圖並在左側下拉列表中選擇Memory usage。每次單擊Update from Device時,都可以獲取設備上使用的內存快照。

enter image description here

+0

不幸的是,出現這種內存問題的設備位於客戶端,在鋼結構中,在繁忙的空間中,因此直接插入到eclipse中並非易事。 –

+1

幾乎沒有可用的應用程序內工具。 S/O問題http://stackoverflow.com/questions/2298208/how-to-discover-memory-usage-of-my-application-in-android有一個寫得很好的答案,討論記憶問題。從那裏鏈接會讓你訪問http://developer.android.com/training/articles/memory.html並從那裏http://developer.android.com/tools/debugging/debugging-memory.html。也許值得一瞧。 – scottt

+0

感謝您的幫助。給你一個滿意的答案,但要等待看看是否有人能夠提供對原始問題的答案,即我們如何才能找出哪個過程導致了低內存,以及爲什麼問題中使用的策略不起作用。 –