Android APP内存管理-深入理解Dalvik虚拟机参数

102 阅读3分钟

在Android应用开发中,内存管理是一个不可忽视的环节。合理的内存管理可以提高应用性能,避免内存溢出(OOM)等问题。本文将深入探讨Android APP的最大可用内存,以及如何通过调整Dalvik虚拟机参数来优化内存使用。

image.png

设备整体内存概览

首先看下整体情况,通过ADB(Android Debug Bridge)查看Android应用的最大可用内存。我们可以使用adb shell命令来执行一些系统命令。下面是一些常用的命令:

  1. 查看系统总内存:

    adb shell cat /proc/meminfo
    

    将返回系统的总内存大小。

  2. 查看应用的内存使用情况:

    adb shell dumpsys meminfo <package_name>
    

    <package_name>替换为你想要检查的应用的包名。这将返回该应用的内存使用详情。

  3. 查看应用的最大可用内存:

    adb shell cat /proc/<pid>/status | grep VmHWM
    

    <pid>替换为应用的进程ID。VmHWM表示该进程的最大常驻集大小,即该进程曾经使用的最大的物理内存量。

  4. 查看所有进程的内存使用情况:

    adb shell top
    

    这个命令会显示所有进程的内存使用情况,包括每个进程的PID、用户ID、线程数、内存使用量等信息。

APP的最大可用内存

我们知道Android系统基于Java虚拟机(JVM)的Dalvik实现,系统对单个进程的最大内存进行了限制。这个限制值定义在/system/build.prop文件中,不同设备的这个值会有所不同,各个厂商的ROM都会根据设备配置对这个值进行修改。例如,第一部Android手机(G1)的内存限制为16M,我现在手上设备LG G7为512M。

应用最大内存值

应用的最大内存值默认是dalvik.vm.heapgrowthlimit,这只针对Dalvik堆,不包括native堆。如果应用需要更大的内存,可以在AndroidManifest.xml中设置android:largeHeap="true"。使用largeHeap后,其限制值会变为dalvik.vm.heapsize

我们可以通过以下代码查看应用的最大内存:

ActivityManager am = (ActivityManager) getApplication().getSystemService(Context.ACTIVITY_SERVICE);
int limitMemorySize = am.getMemoryClass();
int largeMemorySize = am.getLargeMemoryClass();

long maxMemory = Runtime.getRuntime().maxMemory(); // 根据是否largeHeap,等于limitMemory或largeMemory

Android虚拟机参数详解

通过adb shell getprop可以获取到设备内存相关参数,下面是一些常见的重要参数.了解这些内存参数对于优化应用至关重要。

  • dalvik.vm.heapgrowthlimit:Dalvik堆的最大增长限制。
  • dalvik.vm.heapmaxfree:Dalvik堆中最大的空闲内存量。
  • dalvik.vm.heapminfree:Dalvik堆中最小的空闲内存量。
  • dalvik.vm.heapsize:Dalvik堆的最大内存大小。
  • dalvik.vm.heapstartsize:Dalvik堆在应用启动时的初始大小。
  • dalvik.vm.heaptargetutilization:Dalvik堆的目标利用率。

假设我们有一个应用,需要处理大量的图像数据,我们可以调整以下参数:

<application
    android:largeHeap="true">
</application>

然后,我们可以通过adb shell getprop命令查看当前的内存配置:

adb shell getprop dalvik.vm.heapsize

64位应用与内存限制

虽然64位的寻址空间比32位大了很多,但在Android上将应用从32位改为64位并不会带来更大的内存阈值。内存限制仍然由heapgrowthlimitheapsize决定。

总结

Android APP的内存管理是一个复杂但至关重要的话题。通过合理配置Dalvik虚拟机参数,我们可以优化应用的内存使用,提高性能,避免OOM等问题。开发者应该根据应用的具体需求,调整这些参数,以达到最佳的性能表现。

扩展阅读

通过深入理解Dalvik虚拟机的内存参数,我们可以更好地控制Android应用的内存使用,为用户带来更流畅的应用体验。