2014-04-01 84 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

感谢您的帮助。给你一个满意的答案,但要等待看看是否有人能够提供对原始问题的答案,即我们如何才能找出哪个过程导致了低内存,以及为什么问题中使用的策略不起作用。 –