`
MyEyeOfJava
  • 浏览: 1152483 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7af2d6ca-4fe1-3e9a-be85-3f65f7120bd0
测试开发
浏览量:71185
533896eb-dd7b-3cde-b4d3-cc1ce02c1c14
晨记
浏览量:0
社区版块
存档分类
最新评论

Android性能系列-内存篇

阅读更多

内存篇

1) Memory, GC, and Performance

众所周知,与C/C++需要通过手动编码来申请以及释放内存有所不同,Java拥有GC的机制。Android系统里面有一个Generational Heap Memory的模型,系统会根据内存中不同的内存数据类型分别执行不同的GC操作。例如,最近刚分配的对象会放在Young Generation区域,这个区域的对象通常都是会快速被创建并且很快被销毁回收的,同时这个区域的GC操作速度也是比Old Generation区域的GC操作速度更快的。

除了速度差异之外,执行GC操作的时候,所有线程的任何操作都会需要暂停,等待GC操作完成之后,其他操作才能够继续运行。

通常来说,单个的GC并不会占用太多时间,但是大量不停的GC操作则会显著占用帧间隔时间(16ms)。如果在帧间隔时间里面做了过多的GC操作,那么自然其他类似计算,渲染等操作的可用时间就变得少了。

2) Memory Monitor Walkthrough

Android Studio中的Memory Monitor可以很好地帮助我们查看程序的内存使用情况。

3) Memory Leaks

内存泄漏表示的是不再用到的对象因为被错误引用而无法进行回收。

发生内存泄漏会导致Memory Generation中的剩余可用Heap Size越来越小,这样会导致频繁触发GC,更进一步引起性能问题。

举例内存泄漏,下面init()方法来自某个自定义View:

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. private void init() {  
  2. ListenerCollector collector = new ListenerCollector();  
  3. collector.setListener(this, mListener);  
  4. }  

 

上面的例子容易存在内存泄漏,如果activity因为设备翻转而重新创建,自定义的View会自动重新把新创建出来的mListener给绑定到ListenerCollector中,但是当activity被销毁的时候,mListener却无法被回收了。

4) Heap Viewer Walkthrough

下图演示了Android Tools里面的Heap Viewer的功能,我们可以看到当前进程中的Heap Size的情况,分别有哪些类型的数据,占比是多少。

5) Understanding Memory Churn

Memory Churn内存抖动,内存抖动是因为在短时间内大量的对象被创建又马上被释放。瞬间产生大量的对象会严重占用Young Generation的内存区域,当达到阀值,剩余空间不够的时候,会触发GC从而导致刚产生的对象又很快被回收。即使每次分配的对象占用了很少的内存,但是他们叠加在一起会增加Heap的压力,从而触发更多其他类型的GC。这个操作有可能会影响到帧率,并使得用户感知到性能问题。

解决上面的问题有简洁直观方法,如果你在Memory Monitor里面查看到短时间发生了多次内存的涨跌,这意味着很有可能发生了内存抖动。

同时我们还可以通过Allocation Tracker来查看在短时间内,同一个栈中不断进出的相同对象。这是内存抖动的典型信号之一。

当你大致定位问题之后,接下去的问题修复也就显得相对直接简单了。例如,你需要避免在for循环里面分配对象占用内存,需要尝试把对象的创建移到循环体之外,自定义View中的onDraw方法也需要引起注意,每次屏幕发生绘制以及动画执行过程中,onDraw方法都会被调用到,避免在onDraw方法里面执行复杂的操作,避免创建对象。对于那些无法避免需要创建对象的情况,我们可以考虑对象池模型,通过对象池来解决频繁创建与销毁的问题,但是这里需要注意结束使用之后,需要手动释放对象池中的对象。

6) Allocation Tracker

关于Allocation Tracker工具的使用,不展开了,参考下面的链接:

 

 

7) Improve Your Code To Reduce Churn

下面演示一个例子,如何通过修改代码来避免内存抖动。优化之前的内存检测图:

定位代码之后,修复了String拼接的问题:

优化之后的内存监测图:

8) Recap

上面提到了三种测量内存的工具,下面再简要概括一下他们各自的特点:

 

  • Memory Monitor:跟踪整个app的内存变化情况。
  • Heap Viewer:查看当前内存快照,便于对比分析哪些对象有可能发生了泄漏。
  • Allocation Tracker:追踪内存对象的来源。
分享到:
评论

相关推荐

    android-studio-ide-191.5977832-windows.exe

    本篇文章将深入探讨Android Studio 191.5977832这一版本在Windows平台上的特性、安装与配置,以及如何利用其优化开发流程。 首先,Android Studio的版本号"191.5977832"代表了该软件的迭代和更新状态。在这一版本中...

    java私塾跟我学系列-java篇

    Java以其稳定性、安全性以及高效的性能在众多领域得到广泛应用,如Web开发、企业级应用、移动应用(Android)、大数据处理等。 文档中的"Java.doc"可能包含以下内容: 1. **Java基础**:这部分通常会介绍Java的...

    Tuning-android-for-lowmemory-abs-2014.pdf

    文档提到了“Project Svelte”项目,该项目旨在通过一系列内存优化措施,在仅配备512MB RAM的设备上运行Android系统。这项工作包括对Android框架进行各种内存节省的改变,提供针对Android的调整旋钮,验证Linux调整...

    Android性能优化系列之内存优化

    在Java中,内存的分配是由程序完成的,而内存的释放是由垃圾收集器(GarbageCollection,GC)完成的,程序员不需要通过调用函数来释放内存,但也随之带来了内存泄漏的可能,上篇博客,我介绍了Android性能优化系列之...

    android-native-development-kit-cookbook

    - **内存管理**:讨论在使用NDK时如何有效地管理内存资源,避免内存泄漏等问题。 3. **简单示例** - **第一个NDK项目**:通过创建一个简单的项目来演示如何将C/C++代码与Java代码结合。 - **多媒体处理**:介绍...

    Android性能优化篇 [ 谷歌官方 ]-102116321

    谷歌官方推出的Android性能优化系列视频,旨在帮助开发者创建更快速、更高效的App。本篇文章将概述其中的一些核心概念,包括渲染性能、过度绘制和垂直同步(VSYNC)。 首先,渲染性能是用户体验中至关重要的因素。...

    《Android性能测试》 PDF

    本篇文章将依据书中的核心内容,详细阐述Android性能测试的各个方面。 一、性能测试的重要性 在Android平台上,性能测试是确保应用程序流畅运行、提升用户体验的关键步骤。它涉及到CPU利用率、内存管理、电池寿命...

    Android应用性能优化

    本篇文章将围绕“Android应用性能优化”这一主题,详细探讨Android应用架构的设计原则、常见性能瓶颈及其查找方法,并提供一系列有效的解决方案。 #### 一、Android应用架构设计原则 1. **模块化与解耦**:通过...

    android-java-前端-面经-工具集合

    这篇压缩包文件"android-java-前端-面经-工具集合"提供了一系列宝贵的面试资源,涵盖了Java、Android以及前端开发领域,为准备面试的工程师提供了全面的学习材料。以下是这些资源所涉及的重要知识点的详细说明: 1....

    面向Android系统的动态内存管理策略.pdf

    此外,多篇学术文献和技术报告也对Android系统的内存管理进行了研究和讨论,相关专业指导和参考文献也在不断增多,这为Android系统开发人员提供了丰富的学习资源和实践案例。通过不断地研究和探索,可以更好地应对...

    android 通讯录(A-Z)带可模糊查询搜索框

    这篇教程“android 通讯录(A-Z)带可模糊查询搜索框”着重讲解如何创建一个能够进行字母索引排序和模糊查询的通讯录界面。在这个过程中,开发者会接触到Android的UI设计、数据处理以及搜索功能的实现。 首先,UI...

    Android-17-4.2版本源代码

    本篇将围绕Android 4.2的源代码展开,揭示其内部机制,帮助开发者更深入地理解Android系统的工作原理。 一、Android 4.2源代码结构 Android源代码主要分为以下几个部分: 1. **System Core**:包含了Android系统...

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

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

    Android动画介绍-帧动画

    需要注意的是,帧动画可能会消耗较多的内存和CPU资源,特别是在设备性能较低或帧数较高的情况下。因此,在设计动画时,应尽量减少帧的数量,优化图片质量,以保证流畅运行并减少耗电。 此外,Android还提供了其他...

    Android内核和驱动篇-Android内核介绍.txt

    除了上述核心组件,Android内核还包括了一系列其他驱动和模块,例如: - **Kernel Debugger**:用于内核级别的调试。 - **QEMU Trace**:虚拟机跟踪和分析工具。 - **UID Stat**:用户ID统计信息收集。 - **RTC**:...

    Android-18源码

    本篇将围绕"Android-18"源码展开,详细介绍这个版本的源码包含的关键组件、核心功能以及学习与研究的重点。 一、Android系统架构 Android系统由四个主要层次构成:Linux内核、硬件抽象层(HAL)、系统运行库和应用...

    Android小程序--模拟焰火粒子和瀑布粒子

    在实际开发中,开发者还可以利用Android Studio的工具,如Android Profiler来分析性能,确保粒子效果的流畅运行。此外,持续学习和研究开源项目,如libGDX或Cocos2d-x,也能为实现更复杂的粒子效果提供帮助。 总之...

    android--application

    本篇将深入探讨Android Application的各个方面,结合提供的文件名称列表,我们可以联想出一系列与Android应用开发相关的知识点。 1. **应用生命周期**: - Android应用程序具有明确的生命周期,由不同的回调方法如...

    LayaAir系列教程-TS-IDE篇 源代码

    9. **性能优化**:通过IDE的性能分析工具,学习识别和优化LayaAir游戏的性能瓶颈,如减少渲染开销、优化内存使用等。 10. **错误追踪与日志**:了解如何在IDE中设置错误追踪和日志记录,以便在出现问题时快速定位和...

    ImageEditor-Android-master.rar

    综上所述,"ImageEditor-Android-master"项目为我们提供了一个实战图片编辑功能的参考实例,涵盖了Android应用开发的多个关键领域,包括UI设计、图像处理、Intent交互、内存管理和性能优化。通过对该项目的学习和...

Global site tag (gtag.js) - Google Analytics