4、另外还有一种情况是:明明还有很多内存,但是发生OOM了。

这种情况经常出现在生成Bitmap的时候。有兴趣的可以试一下,在一个函数里生成一个13m 的int数组。

再该函数结束后,按理说这个int数组应该已经被释放了,或者说可以释放,这个13M的空间应该可以空出来,

这个时候如果你继续生成一个10M的int数组是没有问题的,反而生成一个4M的Bitmap就会跳出OOM。这个就奇怪了,为什么10M的int够空间,反而4M的Bitmap不够呢?

这个问题困扰很久,在网上,国外各大论坛搜索了很久,一般关于OOM的解释和解决方法都是,如何让GC尽快回收的代码风格之类,并没有实际的支出上述情况的根源。

直到昨天在一个老外的blog上终于看到了这方面的解释,我理解后归纳如下:

1)、一个进程的内存可以由2个部分组成:java 使用内存 ,C 使用内存 ,这两个内存的和必须小于16M,不然就会出现大家熟悉的OOM,这个就是第一种OOM的情况。

2)、更加奇怪的是这个:一旦内存分配给Java后,以后这块内存即使释放后,也只能给Java的使用,这个估计跟java虚拟机里把内存分成好几块进行缓存的原因有关,反正C就别想用到这块的内存了,所以如果Java突然占用了一个大块内存,即使很快释放了:

C能使用的内存 = 16M - Java某一瞬间占用的最大内存。

而Bitmap的生成是通过malloc进行内存分配的,占用的是C的内存,这个也就说明了,上述的4MBitmap无法生成的原因,因为在13M被Java用过后,剩下C能用的只有3M了。

5、在Android平台下实现OpenGL ES程序的贴图加载操作一般是通过BitmapFactory.decodeResource这个api,然后用系统封装好的 GLUtils.texImage2D函数直接转换为gl贴图即可,方便快捷。但在较新版的Android系统中res中的图片文件夹根据dpi设备分辨率的不同,细分了很多文件夹处理以支持不同设备的分辨率加载对应的图片,如drawable-hdpi,drawable-ldpi,drawable- mdpi等,如果没有注意这个问题而将贴图图片随意安置的话,在decode的时候系统会默认根据设备dpi的不同对目标图片格式解码的同时进行大小调整,也就是说有可能破坏原本已经是2^n大小的贴图图片,导致原本在模拟器上正确的绘图在真机上变成大白板!解决这个问题的方法可以将图片放到不受dpi影响的drawable-nodpi中,或者设置BitmapFactory的选项,不处理dpi相关问题。

6、查询内存限制大小:

ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

activityManager.getMemoryClass();

以上方法会返回以 M 为单位的数字,可能在不同的平台或者设备上值都不太一样,比如:HTC G7 默认 24M,Galaxy 36M,emulator-2.3 24M,等等。

android 输出分辨率6,Android4.0 输出分辨率改为1280*720后,出现Out of Memory相关推荐

  1. android触摸屏映射,解决android4.0 触摸屏分辨率映射不准

    前言 几个月以前升级了android4.0,在触摸屏这块一直有个令人头疼的问题,通常触摸屏的分辨率应该是根据当前屏幕分辨率而定. 但android4.0上就有点奇怪,不管怎么换屏幕的分辨率,触摸屏始终 ...

  2. android隐藏底部栏,Android4.0平板开发之隐藏底部任务栏的方法

    本文实例讲述了Android4.0平板开发之隐藏底部任务栏的方法.分享给大家供大家参考,具体如下: getWindow().getDecorView().setSystemUiVisibility(V ...

  3. apr 移植android平台,omap3530移植android4.0

    开发板(应该是基于beagleboard),omap3530,256M DDR SDRAM,256M nand flash.开发板自带了uboot,linux内核2.6.29和android 2.1系 ...

  4. Android4.0 修改系统屏幕分辨率方法

    1 修改板子分区读写权限 mount -o remount rw /tvservice mount -o remount rw /system 2 修改/system/build.proc文件中的ro ...

  5. Android4.0图库Gallery2代码分析(二) 数据管理和数据加载

    Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 2012-09-07 11:19 8152人阅读 评论(12) 收藏 举报 代码分析android相册优化工作 Androi ...

  6. android 4.0.3固件,昂达平板即将发Android4.0.3优化固件

    泡泡网平板电脑频道2月16日 全线升级Android 4.0.首发Android 4.0.3,如此频繁的不断升级,让昂达A10平板在消费者心中攒足了人气,加上强劲的性能与丰富的功能,昂达依旧是国内平板 ...

  7. android执行命令行取得结果,Android调用shell脚本并取得输出

    Android调用shell脚本并获得输出 前段时间做的HLS流媒体服务器可以正常工作了,但是它的启动需要在PC机命令行中进行或者在Android下载个Terminal IDE软件,在Android上 ...

  8. android 相机预览的分辨率,Android开发 Camera2开发_2_预览分辨率或拍照分辨率的计算...

    前言 不管在Camera1或者Camera2在适配不同手机/不同使用场景的情况下都需要计算摄像头里提供的分辨率列表中最合适的那一个分辨率.所以在需要大量机型适配的app,是不建议不经过计算直接自定义分 ...

  9. android QVGA WQVGA HVGA VGA WVGA各个分辨率的区别

    QVGA/WQVGA/HVGA/VGA/WVGA各个分辨率的区别 QVGA/WQVGA/HVGA/VGA/WVGA说的是手机屏幕不同的分辨率,他们之间的区别就是分辨率水平,表现出来的图像细腻度也不相同 ...

最新文章

  1. python编码规范手册-python之(8)Python编码规范整理
  2. JAVA学习笔记——常量与变量
  3. Buuctf(pwn) jarvisoj_tell_me_something 栈溢出
  4. FE助手 json格式化 reslet client
  5. Vue 中computed 与 methods 区别
  6. linux强制关机启动后是白屏,解决安装Ubuntu后,启动出现屏幕空白(全黑,无内容)...
  7. SAP License:把握好集成测试大关,ERP就成功了一大半
  8. JS助记 ----- 正则表达式
  9. java基础:8.1 异常
  10. App 抓包-Fiddler简单使用教程
  11. 微信小游戏(打飞机1)
  12. 软件项目管理工具简介
  13. 数据结构课程设计-通讯录管理系统(C语言版)
  14. linux uvc协议_linux uvc 深入理解(一)
  15. C4D中英文对照—材质编辑器之反射通道
  16. 分享一款在线转换工具,轻松将PDF转换成JPG格式
  17. 联想拯救者Legion Y7000P 2020款ubuntu20.04安装ros noetic与bloom-generate打包ros noetic为deb软件包
  18. 《虚拟仿真实验教学解决方案(BJBR)》(Yanlz+Unity+SteamVR+VR+AR+MR+HR+??BR??+??CR??+??DR??+??ER??+虚拟仿真+人机交互+立钻哥哥+==)
  19. Win8 纯净版安装详细教程
  20. 3GPP TS EPC与5GC相关协议

热门文章

  1. Linux 状态命令之 top
  2. 期货股票量化交易软件如何操作
  3. python井字游戏
  4. 有容乃大——Java集合
  5. Java并发编程:volatile关键字解析
  6. 锁屏面试题百日百刷-面试必问三次握手
  7. 基于存档的多目标算术优化 (MAOA)附matlab代码
  8. springboot 集成Quartz实现任务延迟执行和定时执行功能
  9. 刚刚用鸿蒙跑了个“hello world”!我开始怀疑人生了...
  10. 【基于机械臂触觉伺服的物体操控】论文研读《Goal-Driven Robotic Pushing Using Tactile and Proprioceptive Feedback》