`

android 内存使用

 
阅读更多

   众所周知,在写 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
02 <br>results:
03 Applications Memory Usage (kB):
04 Uptime: 113017 Realtime: 113017
05  
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
14   
15  Objects
16            Views:        0        ViewRoots:        0
17      AppContexts:        0       Activities:        0
18           Assets:        5    AssetManagers:        5
19    Local Binders:       14    Proxy Binders:       21
20 Death Recipients:        0
21  OpenSSL Sockets:        0
22   
23  SQL
24             heap:       64       memoryUsed:       64
25 pageCacheOverflo:        4  largestMemAlloc:       50
26   
27  DATABASES
28   Pagesize   Dbsize  Lookaside  Dbname
29       1024        4         48  launcher.db

       具体每一项代表什么,参考: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里面做一些释放内存操作

 

 

分享到:
评论
1 楼 freedomray 2011-09-25  
不错。尝试一下查看内存的办法。

相关推荐

    android应用内存监控工具

    内存监控工具能够帮助开发者检测和分析应用的内存使用情况,预防和解决内存泄漏等问题。"Emmagee.apk"可能是一个专用于Android设备的内存监控应用,它允许用户直接在手机上查看和分析内存使用状况。 一、Android...

    android 获取cpu使用率, 内存 实时数据

    在实际开发中,这些数据可以用于创建一个实时监控界面,显示设备的CPU使用率和内存使用情况。例如,可以每隔一段时间调用上述方法获取数据并更新UI。同时,也可以结合其他系统指标,如磁盘I/O、网络流量等,为用户...

    使用Android Studio检测内存泄露(LeakCanary)

    Memory Profiler是Android Studio内置的一个强大工具,它允许开发者实时监控应用的内存使用情况。在Memory面板中,你可以开启或关闭内存监测,手动触发垃圾收集(GC),以及生成heap dump文件。通过分析heap dump,...

    Android获取cpu,内存,磁盘使用率信息

    获取系统级信息,如CPU和内存使用率,通常需要`android.permission.SYSTEM_ALERT_WINDOW`(显示系统级窗口)或`android.permission.ACCESS_FINE_LOCATION`(访问位置信息)等权限,而这些权限属于危险权限,需要用户...

    Android 内存溢出问题

    本篇文章将深入探讨Android内存管理的两个核心概念:堆(Heap)和栈(Stack),以及如何理解和解决Android内存溢出问题。 1. 堆与栈 堆和栈是Java虚拟机(JVM)中的两种主要内存区域,它们各自具有特定的用途和...

    Android内存泄漏简介

    内存泄漏是指应用程序中不再使用的内存没有被及时释放,从而导致应用程序的内存使用量不断增长,最终可能导致应用程序耗尽所有可用内存,甚至导致整个系统运行缓慢或崩溃。 在Android平台上,由于Java虚拟机的垃圾...

    Android处理内存泄漏的代码例子

    在Android开发中,内存泄漏是一个严重的问题,它会导致应用程序占用过多内存,影响性能甚至导致应用崩溃。本示例代码着重展示了如何避免Android应用中的内存泄漏,主要包括五个关键方面:关闭游标、重用适配器、回收...

    Android调用C++实现共享内存

    本文将深入探讨如何在Android中利用C++实现共享内存,并结合Binder机制进行跨进程通信。 首先,我们需要了解C++在Android中的应用。Android NDK(Native Development Kit)提供了一个平台,开发者可以在Android应用...

    Unity调用Android查看内存信息1

    本文将深入探讨如何在Unity中调用Android API来查看内存使用情况、系统内存状态以及FPS(帧率)信息,这些数据对于游戏性能优化至关重要。 首先,我们需要在Unity项目中创建一个Android插件。创建一个新的Java类,...

    Android获取当前应用分配的最大内存和目前使用内存的方法

    在Android里,程序内存被分为2部分:native和dalvik,dalvik就是我们普通的Java使用内存,分析堆栈的时候使用的内存。我们创建的对象是在这里面分配的,对于内存的限制是 native+dalvik 不能超过最大限制. Android ...

    Android 内存泄漏利器-LeakCanary(最新使用)

    上面是官方文档给出的介绍,LeakCanary是一个在android上检测内存泄漏的依赖。 使用方法 只需要在你的build.gradle中添加如下依赖即可。 debugImplementation ‘com.squareup.leakcanary:leakcanary-android:2.2’ ...

    Unity调用Android查看内存信息2

    在Unity中,我们可以通过Profiler的Memory部分查看应用的内存占用,但要获取更详细的内存使用情况,就需要借助之前提到的Android原生API。通过传递回来的内存信息,我们可以在Unity的UI上显示这些数据,帮助开发者...

    UnityAndroid/iOS查看真机内存使用情况插件

    在Unity引擎中开发Android或iOS应用时,了解游戏或应用的内存使用情况是至关重要的。内存管理对于优化性能、防止内存泄漏以及确保应用程序稳定运行至关重要。"UnityAndroid/iOS查看真机内存使用情况插件" 提供了一种...

    Android 帧动画优化实现可减少内存使用

    本篇文章将深入探讨如何优化Android帧动画以降低内存使用。 首先,理解帧动画的工作原理至关重要。帧动画是通过`AnimationDrawable`类实现的,它是一个可绘制对象,可以包含一系列`&lt;frame&gt;`元素,每个元素代表一帧...

    Android内存管理小结

    ### Android内存管理知识点总结 #### 一、Dalvik虚拟机及其优势 - **Dalvik虚拟机简介**:Dalvik虚拟机是Android系统的核心组件之一,它负责执行Android应用中的Java字节码。与传统的Java虚拟机(JVM)不同,Dalvik...

    胡凯 - Android内存优化之5R法则

    特别是随着移动设备性能的提升和应用功能的增加,如何有效地管理内存使用成为提升应用性能的关键。根据胡凯在MDCC 2015中国移动开发者大会上的演讲内容,我们可以了解到他提出的“Android内存优化之5R法则”。 5R...

    android手机内存分配小结

    首先,我们需要了解Android内存的基本划分。Android手机的内存并非全部供应用程序直接使用,而是被划分为多个部分,包括: 1. **Modem/Bootloader/SMEM**:这部分内存主要用于运行AMSS(应用多媒体子系统)、...

    M8 android dump内存工具

    在Android系统中,内存分析是调试和优化应用性能的关键步骤。M8 android dump内存工具是一个专为M8设备设计的工具,它可以帮助开发者获取设备内存的状态信息,以便于诊断内存泄漏、性能瓶颈等问题。本文将详细讲解这...

    Android 内存泄露 Mat工具分析

    本文将详细介绍如何使用 MAT 分析 Android 应用程序中的内存泄露,特别是如何根据 heap dump 分析泄漏根源。 ClassLoader 和 Java 类加载机制 在介绍 MAT 之前,需要了解 Java 类加载机制。ClassLoader 是 Java 中...

    android内存泄露测试

    ### Android内存泄露测试详解 在Android开发中,内存管理是一项至关重要的任务,不当的内存管理会导致应用运行缓慢、崩溃甚至耗尽系统资源。内存泄露是内存管理中的一个常见问题,它指的是应用程序分配了内存但未能...

Global site tag (gtag.js) - Google Analytics