`

(二)OOM(Out Of Memory)

 
阅读更多

前面我们提到过使用getMemoryClass()的方法可以得到Dalvik Heap的阈值。简要地获取某个应用的内存占用情况可以参考下面的示例(更多内存查看的知识,可以参考Google官方教程: Investigating Your RAM Usage

1)查看内存使用情况

通过命令行查看内存详细占用情况,如图3所示。

 

图3  命令行查看内存详细占用情况

通过Android Studio的Memory Monitor查看内存中Dalvik Heap的实时变化,如图4、5、6所示。

图4  Memory Monitor查看内存中Dalvik Heap的实时变化(一)


图5  Memory Monitor查看内存中Dalvik Heap的实时变化(二)


图6  Memory Monitor查看内存中Dalvik Heap的实时变化(三)

2)发生OOM的条件

关于Native Heap、Dalvik Heap、PSS等内存管理机制比较复杂,这里就不展开详细描述。简单的说,通过不同的内存分配方式(malloc/mmap/JNIEnv/etc)对不同的对象(Bitmap/etc)进行操作,会因为Android系统版本的差异而产生不同的行为,对Native Heap与Dalvik Heap以及OOM的判断条件都会有所影响。在2.x的系统上,我们常常可以看到Heap Size的total值,明显超过了通过getMemoryClass()获取到的阈值而不会发生OOM的情况。那么,针对2.x与4.x的Android系统,到底如何判断会发生OOM呢?

 

  • Android 2.x系统GC LOG中的dalvik allocated + external allocated + 新分配的大小 >= getMemoryClass()值的时候就会发生OOM。 例如,假设有这么一段Dalvik输出的GC LOG:GC_FOR_MALLOC free 2K, 13% free 32586K/37455K, external 8989K/10356K, paused 20ms,那么32586+8989+(新分配23975)=65550>64M时,就会发生OOM。
  • Android 4.x的系统废除了external的计数器,类似Bitmap的分配改到Dalvik的Java Heap中申请。只要allocated + 新分配的内存 >= getMemoryClass()的时候就会发生OOM,如图7所示(注:虽然图示演示的是ART运行环境,但是统计规则还是和Dalvik保持一致)。

 

 

图7

分享到:
评论

相关推荐

    ANDROIDBITMAP内存限制OOM,OUTOFMEMORY.pdf

    ANDROIDBITMAP内存限制OOM,OUTOFMEMORY.pdf

    ANDROIDBITMAP内存限制OOM,OUTOFMEMORY[文].pdf

    ANDROIDBITMAP内存限制OOM,OUTOFMEMORY[文].pdf

    Android 加载大图及多图避免程序出现OOM(OutOfMemory)异常

    Android 加载大图及多图避免程序出现OOM(OutOfMemory)异常 1、高效加载大图片 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状、不同的大小,但在大多数情况下,这些图片都会大于我们...

    android camera out of memory安卓照相机OOM问题的解决

    如果不能使用,请修改根目录下的project.property的android:target为你当前有的target(不知道怎么改的同学可以从8到21一个个数字去试哦) ...但打开时无自动聚焦,这个问题有需要的同学可以自己加上去哦。...

    Android-OOM.rar_memory android_memory for Android_out

    关于Android out of memory错误的分析

    IBM HeapAnalyzer

    jvm java oom分析 OutOfMemory 内存溢出分析工具

    MySQL OOM(内存溢出)的解决思路

    OOM全称”Out Of Memory”,即内存溢出。 内存溢出已经是软件开发历史上存在了近40年的“老大难”问题。在操作系统上运行各种软件时,软件所需申请的内存远远超出了物理内存所承受的大小,就叫内存溢出。 内存溢出...

    elasticdump报错

    FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 1: node::Abort() [node] 2: 0x8cd49c [node] 3: v8::Utils::ReportOOMFailure(char const*, bool) [node] 4: v8::...

    Pytorch GPU显存充足却显示out of memory的解决方式

    今天在测试一个pytorch代码的时候显示显存不足,但是这个网络框架明明很简单,用CPU跑起来都没有问题,GPU却一直提示out of memory. 在网上找了很多方法都行不通,最后我想也许是pytorch版本的问题,原来我的pytorch...

    MemoryAnalyzer-1.5.0.20150527-win32.win32.x86_64.rar

    out of memory OOM文件分析工具

    【性能】OOM原理解析:LowMemoryKiller原理

    1 概述 Android的设计理念之一,便是应用程序退出,但进程还会继续存在系统以便...Android基于Linux的系统,其实Linux有类似的内存管理策略——OOM killer,全称(Out Of Memory Killer), OOM的策略更多的是用于分配内存

    zabbix 监控、监视、控制

    监控:监视,控制随着用户的增多,服务随时可能会被系统oom out of memory 内存溢出 kill -9 mysql你怎么判断,web服务是因为用户访问过多,达到了瓶颈?还是程序代码bug导致的,内存过多?上线一个新网站: 压力...

    Linux安全攻略 如何才能让内存不再泄漏

    在比较新的Linux内核版本中,有一种名为OOM(Out Of Memory)杀手的算法,它可以在必要时选择执行Killed等程序。悬摆指针可以通过定期对所有已经返还给系统的内存置零来解决。解决内存溢出问题的方法则多种多样。事实...

    解决Android平台中应用程序OOM异常的方法

    首先,OOM就是内存溢出,即Out Of Memory。也就是说内存占有量超过了VM所分配的最大。 怎么解决OOM,通常OOM都发生在需要用到大量内存的情况下(创建或解析Bitmap,分配特大的数组等),在这样的一种情况下,就可能...

    Linux系统:让内存不再泄漏的实用技巧

    在比较新的Linux内核版本中,有一种名为OOM(Out Of Memory)杀手的算法,它可以在必要时选择执行Killed等程序。悬摆指针可以通过定期对所有已经返还给系统的内存置零来解决。解决内存溢出问题的方法则多种多样。 事实...

    Android利用软引用和弱引用避免OOM的方法

    想必很多朋友对OOM(OutOfMemory)这个错误不会陌生,而当遇到这种错误如何有效地解决这个问题呢?今天我们就来说一下如何利用软引用和弱引用来有效地解决程序中出现的OOM问题. 一.了解 强引用、软引用、弱引用、虚...

    Vollery加载大量图片

    大家都知道,图片加载是OOM(OutOfMemory)的常客,用手机测试2000条带图片ListView,完美运行,滑动无卡顿现象。

    Linux攻略:让系统内存不再泄漏的好方法

    在比较新的Linux内核版本中,有一种名为OOM(Out Of Memory)杀手的算法,它可以在必要时选择执行Killed等程序。悬摆指针可以通过定期对所有已经返还给系统的内存置零来解决。解决内存溢出问题的方法则多种多样。

    Java服务器问题排查思路及工具集.zip

    Java服务器问题排查思路及工具集.zip linux工具集 java工具集 cpu占用率高如何解决 内存占用率高如何解决 OOM(out of memory)如何解决

Global site tag (gtag.js) - Google Analytics