如何查看程序可使用的最大内存及内存使用情况

当加载带有大量图片的列表时,通常我们都要考虑到图片达到一定上限时,内存不足引发OOM导致程序崩溃的问题。下一步也许就是去找个图片加载开源框架来一劳永逸。OOM不急着解决,先来了解下关于程序可用内存的一丢丢知识。在面对OOM的时候,你有没有想过这些:

1.什么是OOM 

OOM都知道是Out Of Memory的缩写也就是内存溢出,通俗点说就是内存用完了。

2.为什么会OOM 

内存使用超过上限导致了内存溢出。例如内存泄露,当程序运行过程中动态申请的内存空间不再使用但是又没有及时释放,从而导致应用程序内存持续增长,直到超过内存上限导致程序结束。

3.内存上限怎么查看?每个应用最大能够使用的内存大小都一致吗?如何去查看当前运行应用的内存使用情况? 

这些就是接下来要说明的问题。是了解内存使用的开始。

“我们都知道Android是个多任务操作系统,同时运行着很多程序,都需要分配内存,不可能为一个程序分配越来越多的内存以至于让整个系统
都崩溃,因此heap的大小有个硬性的限制,跟设备相关,从发展来说也是越来越大,G1:16MB,Droid:24MB,Nexus One:32MB,Xoom:48MB,但是一旦超出了这个使用的范围,OOM便产生了”

类似的描述在很多关于内存相关的blog都很容易看到。那么问题来了,

一、一个程序被分配的内存大小怎么查看? 

1.先来了解dalvik堆配置的三个属性

  • dalvik.vm.heapstartsize=8m:表示应用程序启动后,系统为其分配的初始大小。
  • dalvik.vm.heapgrowthlimit=64m:单个应用程序被分配的最大可用内存,即内存阀值。当应用程序的内存使用量超过这个阀值,就会引起OOM。
  • dalvik.vm.heapsize=256m:单个虚拟机可分配的最大内存。(每个应用程序都是在单个虚拟器中运行,为了避免单个进程崩溃导致整个系统的崩溃)单个应用可用最大内存以heapgrowlimit为准,如果想申请更大的内存,可以在manifest.xml的application标签中指定android:largeHeap为true,这样dvm
    heap最大可以达到heapsize,但如果内存使用量也超过了该值,同样会引起OOM发生。

关于这几个属性的更全面的阐述移步:android dalvik heap 浅析Android
内存管理 &Memory Leak & OOM 分析

2.程序可使用最大内存的查看方法

接下来了解下查看/获取heapgrowthlimit和heapsize值的两种方法:

第一种可以用文件管理器打开手机中的system/build.prop文件,这里配置dalvik虚拟机的一些属性:

看到红色框框中熟悉的字眼是不是倍感亲切。这个文件是可编辑的。从这里也可以知道,不同设备,这些值可以是不一样的。“厂家针对设备的配置情况都会适当地修改/system/build.prop文件来调高这个值”。

第二种方法可以通过代码来获取内存阀值:

        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        //可用堆内存,单个应用可以使用的最大内存,如果应用内存使用超过这个值,就报OOM
        int heapgrowthlimit = manager.getMemoryClass();
        //进程内存空间分配的最大值,表示的是单个虚拟机可用的最大内存
        int heapsize = manager.getLargeMemoryClass();
        L.d("heapgrowthlimit = "+heapgrowthlimit+"m"+", heapsize = "+heapsize+"");

了解了一个应用程序最大可使用内存的真面目后,来看看:

二、如何查看运行时内存的使用情况? 

可以借助DDMS中提供的内存监测工具Heap,来监测一个进程的内存变化:

在左面板选中当前运行程序的进程,然后点击“Update Heap”图标,那么右侧面板会显示当前进程的内存使用情况。

  • Heap Size:当前应用程序所占用的堆内存大小(Heap Size = Allocated +Free)
  • Allocated:表示当前活跃对象占用的内存大小
  • Free:表示系统通过gc操作释放了多少内存
  • % Used:当前内存的使用比例(= Allocated/Heap Size)

在上一篇实现一个最简单图片列表引发的问题 里,实现了一个图片列表,当我们不断滑动列表去进行图片加载时时候,在DDMS中观察到Heap
Size的大小并不是保持在一个合理的范围,而是持续上升的,当达到最大内存使用上限比如64m的时候,程序就出现了OOM。

可以通过亲测程序去观察下这些参数的变化。

参考:

Android最佳性能实践(二)——分析内存的使用情况

android dalvik heap 浅析

Android 内存管理 &Memory Leak & OOM 分析

manifest中的largeHeap是干什么用的

Android OOM-调整Heap大小

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-10 14:30:09

如何查看程序可使用的最大内存及内存使用情况的相关文章

C++应用程序性能优化(五)——操作系统的内存管理

C++应用程序性能优化(五)--操作系统的内存管理 一.操作系统内存管理简介 长期以来,在计算机系统中,内存都是一种紧缺和宝贵的资源,应用程序必须在载入内存后才能执行.早期,在内存空间不够大时,同时运行的应用程序的数量会受到很大的限制,甚至当某个应用程序在某个运行时所需内存超过物理内存时,应用程序就会无法运行.现代操作系统(Windows.Linux)通过引入虚拟内存进行内存管理,解决了应用程序在内存不足时不能运行的问题.本质上,虚拟内存就是要让一个程序的代码和数据在没有全部载入内存时即可运行.

文顶顶 iOS开发UI篇—简单的浏览器查看程序

文顶顶 iOS开发UI篇—简单的浏览器查看程序 iOS开发UI篇—简单的浏览器查看程序 一.程序实现要求 1.要求 2. 界面分析 (1) 需要读取或修改属性的控件需要设置属性 序号标签 图片 图片描述 左边按钮 右边按钮 (2) 需要监听响应事件的对象,需要添加监听方法 左边按钮 右边按钮 二.实现基本功能的程序 1 // 2 // YYViewController.m 3 // 03-图片浏览器初步 4 // 5 // Created by apple on 14-5-21. 6 // Co

Windows 查看程序占用的端口

一. 查看所有进程占用的端口  在开始-运行-cmd,输入:netstat –ano可以查看所有进程 二.查看占用指定端口的程序  当你在用tomcat发布程序时,经常会遇到端口被占用的情况,我们想知道是哪个程序或进程占用了端口,可以用该命令 netstat –ano|findstr “指定端口号” 二.查看占用指定端口的程序 当你在用tomcat发布程序时,经常会遇到端口被占用的情况,我们想知道是哪个程序或进程占用了端口,可以用该命令 netstat –ano|findstr “指定端口号”

iOS开发UI基础—简单的浏览器查看程序

iOS开发UI基础-简单的浏览器查看程序 一.程序实现要求 1.要求 2. 界面分析 (1) 需要读取或修改属性的控件需要设置属性 序号标签 图片 图片描述 左边按钮 右边按钮 (2) 需要监听响应事件的对象,需要添加监听方法 左边按钮 右边按钮 二.实现基本功能的程序 1 // 2 // YYViewController.m 3 // 03-图片浏览器初步 4 // 5 // Created by apple on 14-5-21. 6 // Copyright (c) 2014年 itcas

查看程序/DLL的位数 32位 64 位

查看程序或dll,信息,如位数 "D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\dumpbin.exe" /headers  XXX.exe Microsoft (R) COFF/PE Dumper Version 12.00.21005.1 Copyright (C) Microsoft Corporation.  All rights reserved. Dump of file QtWebApp.exe PE

如何在Code::Blocks下查看程序的汇编代码

学习C语言,Code::Blocks是个不错的IDE.有时候我们需要查看程序的对应的汇编代码,那么Code::Blocks如何才能像vc6.0中那样debug时候查看反汇编代码呢? 首先创建一个工程:Create a new project -> ConsoleApplication -> 填上工程文件名和project路径 -> 调试器和编译器默认. 随便在工程里写点什么代码,比如下面的一个递归代码为例:k7娱乐城 #include "stdio.h" #inclu

如何查看程序被哪个版本编译器编译的linux-gcc

如何查看程序被哪个版本编译器编译的linux-gcc http://bbs.csdn.net/topics/380000949 那是不可能的,除非你加入了调试信息,也就是编译的时候加入了-g参数,然后用gdb调试就可以显示.最大程度上查看一个elf文件信息. 如下: [[email protected] rootfs]#  readelf -Wa bin/gzip ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00

如何查看程序所占端口号和IP

如何查看程序所占端口号和IP 一个软件可能占用多个端口拥有多个目标IP,下面以FQ工具Lantern为例,说明端口查看方法: 1.借助第三方软件查看 如果你电脑上安装了360等优化工具,可能会自带查看网络状况的插件如下图: 2.命令行窗口查看 在命令行窗口查看时,可以先查看软件的PID,再通过PID查看端口号: 注意到此处有两个PID号,那么用哪个去查呢?不确定的话就都试一试... 3.小结 由以上分析可知,一个软件可能会占用多对端口和IP值,那么如果我们需要利用FQ工具设置代理的时候应该填哪对

利用OllyDebug查看程序调用的dll模块

最近在做一个Qt项目,在产品发布的时候一直为找不到程序到底缺少了哪些dll组件而困扰.具体问题是,在我的项目中使用到了QMediaPlayer播放一段音频文件,我使用的开发环境的Win7 32位,而在发布安装包的时候,还是照常去掉Qt相关的环境变量,然后运行可执行程序,提示缺少什么dll,我就向可执行程序的目录下拷贝对应的dll,直到程序可以正常启动运行.就是按照上面的方法,我制作了软件的安装包,但是,当将这个软件安装到XP系统上测试时,发现程序没有声音了,这个问题让我很纠结. 后来,我在网上找