如何以编程方式查找Android应用程序上使用的内存?
我希望有办法做到这一点。此外,我如何获得手机的空闲内存?
如何以编程方式查找Android应用程序上使用的内存?
我希望有办法做到这一点。此外,我如何获得手机的空闲内存?
当前回答
是的,您可以通过编程方式获取内存信息,并决定是否执行内存密集型工作。
通过调用获取VM堆大小:
Runtime.getRuntime().totalMemory();
通过调用获取分配的VM内存:
Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
通过调用获取VM堆大小限制:
Runtime.getRuntime().maxMemory()
通过调用获取本机分配的内存:
Debug.getNativeHeapAllocatedSize();
我制作了一个应用程序来计算OutOfMemoryError行为并监控内存使用情况。
https://play.google.com/store/apps/details?id=net.coocood.oomresearch
您可以在https://github.com/coocood/oom-research
其他回答
哈克堡是堆栈溢出的最佳答案之一。它揭示了一个非常晦涩的主题。这对我帮助很大。
另一个非常有用的资源是这段必看的视频:Google I/O 2011:Android应用程序的内存管理
更新:
Process Stats是一项发现应用程序如何管理内存的服务,Dianne Hackborn在博客文章《Process Stats:了解应用程序如何使用RAM》中对此进行了解释:
1) 我想不会,至少不会来自Java。2)
ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
MemoryInfo mi = new MemoryInfo();
activityManager.getMemoryInfo(mi);
Log.i("memory free", "" + mi.availMem);
在android studio 3.0中,他们引入了android profiler,帮助您了解应用程序如何使用CPU、内存、网络和电池资源。
https://developer.android.com/studio/profile/android-profiler
这是一项正在进行的工作,但我不明白:
ActivityManager activityManager = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE);
MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
Log.i(TAG, " memoryInfo.availMem " + memoryInfo.availMem + "\n" );
Log.i(TAG, " memoryInfo.lowMemory " + memoryInfo.lowMemory + "\n" );
Log.i(TAG, " memoryInfo.threshold " + memoryInfo.threshold + "\n" );
List<RunningAppProcessInfo> runningAppProcesses = activityManager.getRunningAppProcesses();
Map<Integer, String> pidMap = new TreeMap<Integer, String>();
for (RunningAppProcessInfo runningAppProcessInfo : runningAppProcesses)
{
pidMap.put(runningAppProcessInfo.pid, runningAppProcessInfo.processName);
}
Collection<Integer> keys = pidMap.keySet();
for(int key : keys)
{
int pids[] = new int[1];
pids[0] = key;
android.os.Debug.MemoryInfo[] memoryInfoArray = activityManager.getProcessMemoryInfo(pids);
for(android.os.Debug.MemoryInfo pidMemoryInfo: memoryInfoArray)
{
Log.i(TAG, String.format("** MEMINFO in pid %d [%s] **\n",pids[0],pidMap.get(pids[0])));
Log.i(TAG, " pidMemoryInfo.getTotalPrivateDirty(): " + pidMemoryInfo.getTotalPrivateDirty() + "\n");
Log.i(TAG, " pidMemoryInfo.getTotalPss(): " + pidMemoryInfo.getTotalPss() + "\n");
Log.i(TAG, " pidMemoryInfo.getTotalSharedDirty(): " + pidMemoryInfo.getTotalSharedDirty() + "\n");
}
}
为什么PID没有映射到activityManager.getProcessMemoryInfo()中的结果?很明显,你想让结果数据变得有意义,那么为什么谷歌会让结果之间的关联变得如此困难呢?如果我想处理整个内存使用情况,当前系统甚至无法正常工作,因为返回的结果是一个android.os.Debug.MemoryInfo对象数组,但这些对象都没有告诉你它们与哪些pid相关。如果只传入所有pid的数组,则无法理解结果。据我所知,一次传递多个pid是没有意义的,如果是这样,为什么要使activityManager.getProcessMemoryInfo()只接受一个int数组?
Android Studio 0.8.10+推出了一个非常有用的工具,叫做内存监视器。
它的好处:
在图形中显示可用和已使用的内存,以及垃圾收集随着时间的推移。快速测试应用程序速度是否可能与过多的垃圾收集事件相关。快速测试应用程序崩溃是否与内存不足有关。
图1。在Android内存监视器上强制GC(垃圾收集)事件
通过使用它,您可以获得有关应用程序RAM实时消耗的大量有用信息。