如何以编程方式查找Android应用程序上使用的内存?

我希望有办法做到这一点。此外,我如何获得手机的空闲内存?


当前回答

我在阅读答案时感到困惑,所以我决定阅读文档。好的,我们来做:

本机堆内存使用情况

您可以使用Debug对象获取设备的本机堆内存大小:

long nativeTotal = Debug.getNativeHeapSize();
long nativeFree = Debug.getNativeHeapFreeSize();
long nativeAllocated = Debug.getNativeHeapAllocatedSize();
long nativeUsed = nativeTotal - nativeFree;

注意:nativeUsed和nativeAllocated具有相同的值。

运行时内存使用

使用应用程序的运行时对象的内存使用情况。每个应用程序都有一个运行时对象来访问其接口:

Runtime runtime = Runtime.getRuntime();
long runtimeMax = runtime.maxMemory();
long runtimeTotal = runtime.totalMemory();
long runtimeFree = runtime.freeMemory();
long runtimeUsed = runtimeTotal - runtimeFree;

系统内存使用

您可以使用ActivityManager.MemoryInfo对象获取系统的内存使用情况:

ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
long systemTotal = memoryInfo.totalMem;
long systemFree = memoryInfo.availMem;
long systemUsed = systemTotal - systemFree;

过程内存使用

读取系统内存使用情况的另一种方法是在linux中解析/proc/meminfo文件的内容。

RandomAccessFile reader = new RandomAccessFile("/proc/meminfo", "r");
Pattern pattern = Pattern.compile("(\\d+)");
Matcher totalMatcher = pattern.matcher(reader.readLine());
totalMatcher.find();
long procTotal = Long.parseLong(totalMatcher.group(1)) * 1024L; // KB to B
Matcher freeMatcher = pattern.matcher(reader.readLine());
freeMatcher.find();
long procFree = Long.parseLong(freeMatcher.group(1)) * 1024L; // KB to B
long procUsed = procTotal - procFree;

好吧,我还是很困惑。但这是所有可以获得内存使用率的方法。记录它们以调试应用程序!!!

我还为他们每个人提供了一个链接,以阅读他们的用法和信息。

其他回答

Android Studio 0.8.10+推出了一个非常有用的工具,叫做内存监视器。

它的好处:

在图形中显示可用和已使用的内存,以及垃圾收集随着时间的推移。快速测试应用程序速度是否可能与过多的垃圾收集事件相关。快速测试应用程序崩溃是否与内存不足有关。

图1。在Android内存监视器上强制GC(垃圾收集)事件

通过使用它,您可以获得有关应用程序RAM实时消耗的大量有用信息。

是的,您可以通过编程方式获取内存信息,并决定是否执行内存密集型工作。

通过调用获取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

在android studio 3.0中,他们引入了android profiler,帮助您了解应用程序如何使用CPU、内存、网络和电池资源。

https://developer.android.com/studio/profile/android-profiler

哈克堡是堆栈溢出的最佳答案之一。它揭示了一个非常晦涩的主题。这对我帮助很大。

另一个非常有用的资源是这段必看的视频:Google I/O 2011:Android应用程序的内存管理


更新:

Process Stats是一项发现应用程序如何管理内存的服务,Dianne Hackborn在博客文章《Process Stats:了解应用程序如何使用RAM》中对此进行了解释:

我在阅读答案时感到困惑,所以我决定阅读文档。好的,我们来做:

本机堆内存使用情况

您可以使用Debug对象获取设备的本机堆内存大小:

long nativeTotal = Debug.getNativeHeapSize();
long nativeFree = Debug.getNativeHeapFreeSize();
long nativeAllocated = Debug.getNativeHeapAllocatedSize();
long nativeUsed = nativeTotal - nativeFree;

注意:nativeUsed和nativeAllocated具有相同的值。

运行时内存使用

使用应用程序的运行时对象的内存使用情况。每个应用程序都有一个运行时对象来访问其接口:

Runtime runtime = Runtime.getRuntime();
long runtimeMax = runtime.maxMemory();
long runtimeTotal = runtime.totalMemory();
long runtimeFree = runtime.freeMemory();
long runtimeUsed = runtimeTotal - runtimeFree;

系统内存使用

您可以使用ActivityManager.MemoryInfo对象获取系统的内存使用情况:

ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
long systemTotal = memoryInfo.totalMem;
long systemFree = memoryInfo.availMem;
long systemUsed = systemTotal - systemFree;

过程内存使用

读取系统内存使用情况的另一种方法是在linux中解析/proc/meminfo文件的内容。

RandomAccessFile reader = new RandomAccessFile("/proc/meminfo", "r");
Pattern pattern = Pattern.compile("(\\d+)");
Matcher totalMatcher = pattern.matcher(reader.readLine());
totalMatcher.find();
long procTotal = Long.parseLong(totalMatcher.group(1)) * 1024L; // KB to B
Matcher freeMatcher = pattern.matcher(reader.readLine());
freeMatcher.find();
long procFree = Long.parseLong(freeMatcher.group(1)) * 1024L; // KB to B
long procUsed = procTotal - procFree;

好吧,我还是很困惑。但这是所有可以获得内存使用率的方法。记录它们以调试应用程序!!!

我还为他们每个人提供了一个链接,以阅读他们的用法和信息。