上一篇《关于bitmap的一些知识》有提到:  Android系统分配给每个应用程序的内存是有限的(在Android 3.1以及更高的版本中,可以在AndroidManifest.xml的application标签中增加一个值等于“true”的android:largeHeap属性来通知Dalvik虚拟机应用程序需要使用较大的Java Heap)。那么今天就来详细的讲解下 。

  每个app内存有限制,那限制是多大呢?作为开发,如果不知道多大限制,那设计出来得程序如果特别耗内存,你的程序经常OOM,是没有人用的。

  Android里,程序内存被分为2部分:native和dalvik,dalvik就是我们普通的java使用内存,即堆栈内存。我们创建的对象是在这里面分配的,对于内存的限制是 native+dalvik 不能超过最大限制。可以通过以下2个方式来查看该设备的内存限制。

 一种方式是通过adb命令连接设备,执行以下命令:

  root@mars-a31s:/ # getprop dalvik.vm.heapsize
  384m

   可以看到,该设备限制是384M。也可以通过命名setprop dalvik.vm.heapsize 100m 来修改大小。但是一般设备是不允许的,必须要有root权限才行。

   另外的方式是通过代码获取,如下: 

ActivityManager activityManager =(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
activityManager.getMemoryClass();
activityManager.getLargeMemoryClass();//获取最大内存android:largeHeap=“true” 或者Runtime.getRuntime().maxMemory()

  有开发觉得,有些设备限制太小了比如64M。所以android提供了largeHeap,会请求系统为Dalvik虚拟机分配更大的内存空间。只需在manifest文件application节点加入 android:largeHeap=“true” 即可。

<application android:icon="@drawable/icon"
  android:allowBackup="false"
  android:label="@string/app_name"
  android:debuggable="true"
  android:theme="@android:style/Theme.Black"
  android:largeHeap="true"
>
 但是,这个largeHeap不是说一定会很大。如果你自己的程序占用内存还是超过了,那只有自己分析代码了。是否能进行优化。

  下面我们看程序运行的内存情形,再确定怎么优化。

//$package_name:应用包名
  //$pid:应用进程ID,可以用PS命令查看
  adb shell dumpsys meminfo $package_name or $pid 


dalvik:是指dalvik所使用的内存。 
native:是被native堆使用的内存。应该指使用C\C++在堆上分配的内存。 
other:是指除dalvik和native使用的内存。但是具体是指什么呢?至少包括在C\C++分配的非堆内存,比如分配在栈上的内存。puzlle! 
Pss:它是把共享内存根据一定比例分摊到共享它的各个进程来计算所得到进程使用内存。网上又说是比例分配共享库占用的内存,也就是上面所说的进程共享问题。 
PrivateDirty:它是指非共享的,又不能换页出去(can not be paged to disk )的内存的大小。比如Linux为了提高分配内存速度而缓冲的小对象,即使你的进程结束,该内存也不会释放掉,它只是又重新回到缓冲中而已。 
SharedDirty:参照PrivateDirty我认为它应该是指共享的,又不能换页出去(can not be paged to disk )的内存的大小。比如Linux为了提高分配内存速度而缓冲的小对象,即使所有共享它的进程结束,该内存也不会释放掉,它只是又重新回到缓冲中而已。

 确定好哪部分内存占用大后,再进行优化。怎么优化,后续我将进行再次学习分享。


 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐