一、为何会出现OOM

因为Android系统的硬件资源是相当有限的,而且分配给一个应用的资源更为有限,尤其是内存。当应用突然申请的内存大于允许的最大值的时候,就会出现OOM。

如果想要获取App的内存使用情况,可以使用以下方法:

 final int M =  * ;
final Runtime runtime = Runtime.getRuntime(); Log.i("Memory", "最大可用内存:" + runtime.maxMemory() / M + "M");
Log.i("Memory", "当前可用内存:" + runtime.totalMemory() / M + "M");
Log.i("Memory", "当前空闲内存:" + runtime.freeMemory() / M + "M");
Log.i("Memory", "当前已使用内存:" + (runtime.totalMemory() - runtime.freeMemory()) / M + "M");

下面简单说一下每个函数的作用:

1)maxMemory()

该函数用于获取系统分配给JVM的最大可用内存(其实就是Java Heap),比如说使用以下Java命令启动Java程序:

java -Xms64m -Xmx1024m App01
那么,“-Xms64m”表示App01程序的初始内存为64M,“-Xmx1024m”表示App01最大可以使用的内存为1024M。当程序需要更新内存的时候,它最多可以增加到1024M,如果超过该值,即会报OOM错误。
 
 Android系统用的是Dalvik虚拟机,每个App的最大可用内存由系统指定(在/system/build.prop文件中有定义),如HTC E8手机的内存为2G,App的最大可用内存为192M。如果需要更大的内存的话,可以在AndroidManifest.xml中,给Application标签配置“android:largeHeap="true"”属性。这样的话,这台手机就可以最大获得512M内存了。
 
 你可能会很好奇,为什么有些APP(比如大型游戏)可以超过这个值?那是因为Java内存又分为Java Heap和Native Heap,Native Heap是不受该值约束的。像C/C++的内存都是在Native Heap中分配的。另外Bitmap是在Java Heap中分配的,我们开发过程中经常遇到由Bitmap引起的OOM,这就是一个例子。
 
2)totalMemory()
 
 该函数用于获取JVM当前可用内存。如果程序需要更多的内存,它最多不能超过maxMemory。
 如果设置为“-Xms1024m -Xmx1024m”,那么totalMemory=maxMamory。
 
3)freeMemory()
 
 该函数用于获取JVM可以被释放的内存。如果调用System.gc()的话,这部分内存将会被释放掉。
 若要准确地计算出当前程序所使用的内存,可以使用以下公式:
final long usedMemory = totalMemory() - freeMemory();

二、修改应用内存的最大值

maxMemory限制了当前应用能够使用的最大内存值,而最大内存值基本上就决定了OOM出现的概率,目前能够修改最大内存值的方式就是,在Manifest里面添加Application标签:

android:largeHeap="true"

此时再测试一下,上面的代码,就基本上可以看到,最大内存值变大了。

具体的其他避免OOM的方式,目前不多赘述,写本文也是因为在正常使用时发现,即使使用了了解的避免OOM的方式时但还是无法避免OOM,只能采取修改一些应用配置信息来避免OOM。

Android OOM 引发的思考的更多相关文章

  1. Spring之LoadTimeWeaver——一个需求引发的思考---转

    原文地址:http://www.myexception.cn/software-architecture-design/602651.html Spring之LoadTimeWeaver——一个需求引 ...

  2. android oom 全解析

    Android oom 有时出现很频繁,这一般不是Android设计的问题,一般是我们的问题. 就我的经验而言,出现oom,无非主要是以下几个方面: 一.加载对象过大 二.相应资源过多,没有来不及释放 ...

  3. 由SecureCRT引发的思考和学习

    由SecureCRT引发的思考和学习 http://mp.weixin.qq.com/s?__biz=MzAxOTAzMDEwMA==&mid=2652500597&idx=1& ...

  4. 解决一道leetcode算法题的曲折过程及引发的思考

    写在前面 本题实际解题过程是 从 40秒 --> 24秒 -->1.5秒 --> 715ms --> 320ms --> 48ms --> 36ms --> ...

  5. 【思考】由安装zabbix至排障php一系列引发的思考

    [思考]由安装zabbix至排障php一系列引发的思考 linux的知识点林立众多,很有可能你在排查一个故障的时候就得用到另一门技术的知识: 由于linux本身的应用依赖的库和其它环境环环相扣,但又没 ...

  6. 由<a href = "#" > 引发的思考

    原文:由<a href = "#" > 引发的思考 前阵子在一个移动项目中,通过 <a href = "#" >  的方式 绑定clic ...

  7. 曲演杂坛--一条DELETE引发的思考

    原文:曲演杂坛--一条DELETE引发的思考 场景介绍: 我们有一张表,专门用来生成自增ID供业务使用,表结构如下: CREATE TABLE TB001 ( ID ,) PRIMARY KEY, D ...

  8. class_copyIvarList方法获取实例变量问题引发的思考

    在runtime.h中,你可以通过其中的一个方法来获取实例变量,那就是class_copyIvarList方法,具体的实现如下: - (NSArray *)ivarArray:(Class)cls { ...

  9. Android插件化的思考——仿QQ一键换肤,思考比实现更重要!

    Android插件化的思考--仿QQ一键换肤,思考比实现更重要! 今天群友希望写一个关于插件的Blog,思来想去,插件也不是很懂,只是用大致的思路看看能不能模拟一个,思路还是比较重要的,如果你有兴趣的 ...

随机推荐

  1. Spring事务隔离级别和传播性

    事务的隔离级别也分为四种: read uncommited(读未提交). read commited(读提交). read repeatable(读重复). serializable(序列化), 这四 ...

  2. python 装饰器的理解以及类装饰器

    python装饰器的作用就是在不改变原有函数结构的情况下给该函数增加一个新功能,就是不入侵到原来函数里面修改代码给其增加一个新功能 先看代码 def out(fn): def inner(*args, ...

  3. 在阿里云Ubuntu 14.04 Linux服务器上安装docker

    参考 How To Install and Use Docker: Getting Started 这篇最靠谱的文档在阿里云 Ubuntu  14.04 服务器上成功安装 docker . ---- ...

  4. js计算base64文件流大小

    getImgSize(str) { //获取base64图片大小,返回KB数字 var str = base64url.replace('data:image/jpeg;base64,', '');/ ...

  5. Netty4.0源码解析 NioServerSocketChannel

    一.引言Netty的Channel在JDK NIO的Channel基础上做了一层封装,提供了更多的功能.Netty的中的Channel实现类主要有:NioServerSocketChannel(用于服 ...

  6. extentReport生成测试报告

    之前在使用extentReport生成测试报告的时候,没有加载到相关的css,经检查为下面两个文件没有正确加载 后改变配置,加载本地的css和js文件,目前测试报告正确显示 1.创建TestNg的Re ...

  7. 深入浅出PF 学习笔记---资源文件

    引用   xmlns:sys="clr-namespace:System;assembly=mscorlib" <Window.Resources><sys:St ...

  8. Flask最强攻略 - 跟DragonFire学Flask - 第三篇 Flask 中的 request 之 先知道有这么个东西

    每个框架中都有处理请求的机制(request),但是每个框架的处理方式和机制是不同的 为了了解Flask的request中都有什么东西,首先我们要写一个前后端的交互 基于HTML + Flask 写一 ...

  9. gcc 与 g++的区别

    原文: http://www.cnblogs.com/wb118115/p/5969775.html ------------------------------------------------- ...

  10. [leetcode]64. Minimum Path Sum最小路径和

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...