众所周知,在写 android 程序的时候,很容易出现 OOM ,而出现的时机大多数是由 Bitmap decode 引发的:
1 |
ERROR/AndroidRuntime( 16350 ): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
|
我们知道,android程序内存一般限制在16M,当然也有24M的,而android程序内存被分为2部分:native和dalvik,dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的,而bitmap是直接在native上分配的,对于内存的限制是 native+dalvik 不能超过最大限制。
用以下命令可以查看程序的内存使用情况:
1 |
adb shell dumpsys meminfo $package_name or $pid //使用程序的包名或者进程id
|
用android自带的launcher程序为例:
01 |
run: adb shell dumpsys meminfo com.android.launcher |
03 |
Applications Memory Usage (kB): |
04 |
Uptime: 113017 Realtime: 113017 |
06 |
** MEMINFO in pid 129 [com.android.launcher] **
|
07 |
native dalvik other total
|
08 |
size : 4572 3527 N/A 8099
|
09 |
allocated: 4113 2684 N/A 6797
|
10 |
free : 406 843 N/A 1249
|
11 |
(Pss): 1775 3572 3953 9300
|
12 |
(shared dirty): 1448 4020 4792 10260
|
13 |
(priv dirty): 1652 1308 708 3668
|
17 |
AppContexts: 0 Activities: 0
|
18 |
Assets: 5 AssetManagers: 5
|
19 |
Local Binders: 14 Proxy Binders: 21
|
24 |
heap: 64 memoryUsed: 64
|
25 |
pageCacheOverflo: 4 largestMemAlloc: 50 |
28 |
Pagesize Dbsize Lookaside Dbname
|
具体每一项代表什么,参考:http://stackoverflow.com/questions/2298208/how-to-discover-memory-usage-of-my-application-in-android#2299813,我们比较关心的是这2行:
1 |
native dalvik other total
|
2 |
size : 4572 3527 N/A 8099
|
3 |
allocated: 4113 2684 N/A 6797 |
其中size是需要的内存,而allocated是分配了的内存,对应的2列分别是native和dalvik,当总数也就是total这一列超过单个程序内存的最大限制时,OOM就很有可能会出现了。
多数时候,发生OOM 都是在做一些跟图片相关的操作,以下提出一些建议尽量可以减少这种情况的发生:
1 |
1 .decode bitmap 的时候,尽量配置下Options,例如:inSameSize
|
2 |
2 .Bitmap使用完以后,调用 bitmap.recycle()来释放内存
|
3 |
3 .如果应用是基于图片的应用,尽量采用LazyLoad和DymanicRecycle
|
4 |
4 .decode bitmap 的时候,将decode代码 try catch 出来, catch oom error,避免程序crash,可以在 catch 里面做一些释放内存操作
|
分享到:
相关推荐
内存监控工具能够帮助开发者检测和分析应用的内存使用情况,预防和解决内存泄漏等问题。"Emmagee.apk"可能是一个专用于Android设备的内存监控应用,它允许用户直接在手机上查看和分析内存使用状况。 一、Android...
在实际开发中,这些数据可以用于创建一个实时监控界面,显示设备的CPU使用率和内存使用情况。例如,可以每隔一段时间调用上述方法获取数据并更新UI。同时,也可以结合其他系统指标,如磁盘I/O、网络流量等,为用户...
Memory Profiler是Android Studio内置的一个强大工具,它允许开发者实时监控应用的内存使用情况。在Memory面板中,你可以开启或关闭内存监测,手动触发垃圾收集(GC),以及生成heap dump文件。通过分析heap dump,...
获取系统级信息,如CPU和内存使用率,通常需要`android.permission.SYSTEM_ALERT_WINDOW`(显示系统级窗口)或`android.permission.ACCESS_FINE_LOCATION`(访问位置信息)等权限,而这些权限属于危险权限,需要用户...
本篇文章将深入探讨Android内存管理的两个核心概念:堆(Heap)和栈(Stack),以及如何理解和解决Android内存溢出问题。 1. 堆与栈 堆和栈是Java虚拟机(JVM)中的两种主要内存区域,它们各自具有特定的用途和...
内存泄漏是指应用程序中不再使用的内存没有被及时释放,从而导致应用程序的内存使用量不断增长,最终可能导致应用程序耗尽所有可用内存,甚至导致整个系统运行缓慢或崩溃。 在Android平台上,由于Java虚拟机的垃圾...
在Android开发中,内存泄漏是一个严重的问题,它会导致应用程序占用过多内存,影响性能甚至导致应用崩溃。本示例代码着重展示了如何避免Android应用中的内存泄漏,主要包括五个关键方面:关闭游标、重用适配器、回收...
本文将深入探讨如何在Android中利用C++实现共享内存,并结合Binder机制进行跨进程通信。 首先,我们需要了解C++在Android中的应用。Android NDK(Native Development Kit)提供了一个平台,开发者可以在Android应用...
本文将深入探讨如何在Unity中调用Android API来查看内存使用情况、系统内存状态以及FPS(帧率)信息,这些数据对于游戏性能优化至关重要。 首先,我们需要在Unity项目中创建一个Android插件。创建一个新的Java类,...
在Android里,程序内存被分为2部分:native和dalvik,dalvik就是我们普通的Java使用内存,分析堆栈的时候使用的内存。我们创建的对象是在这里面分配的,对于内存的限制是 native+dalvik 不能超过最大限制. Android ...
上面是官方文档给出的介绍,LeakCanary是一个在android上检测内存泄漏的依赖。 使用方法 只需要在你的build.gradle中添加如下依赖即可。 debugImplementation ‘com.squareup.leakcanary:leakcanary-android:2.2’ ...
在Unity中,我们可以通过Profiler的Memory部分查看应用的内存占用,但要获取更详细的内存使用情况,就需要借助之前提到的Android原生API。通过传递回来的内存信息,我们可以在Unity的UI上显示这些数据,帮助开发者...
在Unity引擎中开发Android或iOS应用时,了解游戏或应用的内存使用情况是至关重要的。内存管理对于优化性能、防止内存泄漏以及确保应用程序稳定运行至关重要。"UnityAndroid/iOS查看真机内存使用情况插件" 提供了一种...
本篇文章将深入探讨如何优化Android帧动画以降低内存使用。 首先,理解帧动画的工作原理至关重要。帧动画是通过`AnimationDrawable`类实现的,它是一个可绘制对象,可以包含一系列`<frame>`元素,每个元素代表一帧...
### Android内存管理知识点总结 #### 一、Dalvik虚拟机及其优势 - **Dalvik虚拟机简介**:Dalvik虚拟机是Android系统的核心组件之一,它负责执行Android应用中的Java字节码。与传统的Java虚拟机(JVM)不同,Dalvik...
特别是随着移动设备性能的提升和应用功能的增加,如何有效地管理内存使用成为提升应用性能的关键。根据胡凯在MDCC 2015中国移动开发者大会上的演讲内容,我们可以了解到他提出的“Android内存优化之5R法则”。 5R...
首先,我们需要了解Android内存的基本划分。Android手机的内存并非全部供应用程序直接使用,而是被划分为多个部分,包括: 1. **Modem/Bootloader/SMEM**:这部分内存主要用于运行AMSS(应用多媒体子系统)、...
在Android系统中,内存分析是调试和优化应用性能的关键步骤。M8 android dump内存工具是一个专为M8设备设计的工具,它可以帮助开发者获取设备内存的状态信息,以便于诊断内存泄漏、性能瓶颈等问题。本文将详细讲解这...
本文将详细介绍如何使用 MAT 分析 Android 应用程序中的内存泄露,特别是如何根据 heap dump 分析泄漏根源。 ClassLoader 和 Java 类加载机制 在介绍 MAT 之前,需要了解 Java 类加载机制。ClassLoader 是 Java 中...
### Android内存泄露测试详解 在Android开发中,内存管理是一项至关重要的任务,不当的内存管理会导致应用运行缓慢、崩溃甚至耗尽系统资源。内存泄露是内存管理中的一个常见问题,它指的是应用程序分配了内存但未能...