Android中内存泄露代码优化及检测

简介:
  内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。

        正如下文所说,内存泄漏与许多其他问题有着相似的症状,并且通常情况下只能由那些可以获得程序源代码的程序员才可以分析出来。然而,有不少人习惯于把任何不需要的内存使用的增加描述为内存泄漏,即使严格意义上来说这是不准确的。

一、内存泄露

        内存泄漏会因为减少可用内存的数量从而降低计算机的性能。最终,在最糟糕的情况下,过多的可用内存被分配掉导致全部或部分设备停止正常工作,或者应用程序崩溃。

        内存泄漏可能不严重,甚至能够被常规的手段检测出来。在现代操作系统中,一个应用程序使用的常规内存在程序终止时被释放。这表示一个短暂运行的应用程序中的内存泄漏不会导致严重后果。

        在以下情况,内存泄漏导致较严重的后果:

        1)程序运行后置之不理,并且随着时间的流失消耗越来越多的内存(比如服务器上的后台任务,尤其是嵌入式系统中的后台任务,这些任务可能被运行后很多年内都置之不理);
        2)新的内存被频繁地分配,比如当显示电脑游戏或动画视频画面时;
        3)程序能够请求未被释放的内存(比如共享内存),甚至是在程序终止的时候;
        4)泄漏在操作系统内部发生;
        5)泄漏在系统关键驱动中发生;
        6)内存非常有限,比如在嵌入式系统或便携设备中;
        7)当运行于一个终止时内存并不自动释放的操作系统(比如AmigaOS)之上,而且一旦丢失只能通过重启来恢复。

二、内存泄漏检测工具

        当一个Java对象已经没有其他对象引用它时,Java的垃圾回收器会将其回收并释放内存。

        一个Java的Heap Dump文件指的是在一个时间点上Java对象的内存镜像导出文件。它包括了所有的对象、字段、原始类型和对象引用。它可以指示当JVM产生OutOfMemory错误的情况下自动创建一个堆转储。

        使用Eclipse MAT(Eclipse Memory Analyser),有助于图形化基于Java堆转储的对象引用,并提供工具以发现潜在的内存泄露。为了能让Java虚拟机(JVM)在发生OutOfMemory错误时生成内存镜像文件,我们可以使用-XX:+HeapDumpOnOutOfMemoryError选项,如图21.1所示。

        安装Eclipse MAT的步骤如下:

        1)启动Eclipse,点击Help -> Intall New Software...;
        2)点击输入栏右侧小箭头,选择"Juno"(不同版本要找到和自己版本名称对应的选项);
        3)等待列表更新完毕,找到并展开"General Purpose Tools";
        4)选中并下载其中的"Memory Analyser (Incubation)"和"Memory Analyser (Charts)"两项。
        5)之后根据提示进行安装。

三、MAT使用示例

        1)创建工程

        新建Android 工程 "com.devdiv.test.mat_test"。并且新建如下类,然后运行该工程。

[代码]java代码:

package com.devdiv.test.mat_test;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

    List<String> list = new ArrayList<String>();
//    private PersonInfo person = new PersonInfo();
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        new Thread () {
            @Override
            public void run() {   
                while (true){
                	MainActivity.this.list.add("OutOfMemoryError soon");
                }
            }
        }.start();
    }
  
}

 2)分析内存

        要获得.hprof内存镜像文件,你可以在进程运行过程中,切换到DDMS的透视图页面,选中您要查看内存镜像的进程,点击“Dump HPROF file”即可。

 
图16-1  内存镜像文件分析

        生成的hprof文件会默认使用MAT打开,选择“Leak Suspects Report”后,点击Finish按钮。

 
图16-2  用MAT打开内存镜像文件

        经过一段时间的初始化后,就能够直观地看到关于内存泄露的饼图,如下图所示:

 
图16-3  内存泄露饼图

        然后就可以查看相关的内存泄露,如下图所示:

 
图16-4  内存泄露树形图


相关文章
|
29天前
|
编解码 算法 Java
构建高效的Android应用:内存优化策略详解
随着智能手机在日常生活和工作中的普及,用户对移动应用的性能要求越来越高。特别是对于Android开发者来说,理解并实践内存优化是提升应用程序性能的关键步骤。本文将深入探讨针对Android平台的内存管理机制,并提供一系列实用的内存优化技巧,以帮助开发者减少内存消耗,避免常见的内存泄漏问题,并确保应用的流畅运行。
|
1月前
|
IDE Linux 开发工具
内存泄漏检测工具Valgrind:C++代码问题检测的利器(一)
内存泄漏检测工具Valgrind:C++代码问题检测的利器
72 0
|
5天前
|
移动开发 Android开发 开发者
构建高效Android应用:采用Kotlin进行内存优化的策略
【4月更文挑战第18天】 在移动开发领域,性能优化一直是开发者关注的焦点。特别是对于Android应用而言,由于设备和版本的多样性,确保应用流畅运行且占用资源少是一大挑战。本文将探讨使用Kotlin语言开发Android应用时,如何通过内存优化来提升应用性能。我们将从减少不必要的对象创建、合理使用数据结构、避免内存泄漏等方面入手,提供实用的代码示例和最佳实践,帮助开发者构建更加高效的Android应用。
5 0
|
7天前
|
缓存 移动开发 Java
构建高效的Android应用:内存优化策略
【4月更文挑战第16天】 在移动开发领域,尤其是针对资源有限的Android设备,内存优化是提升应用性能和用户体验的关键因素。本文将深入探讨Android应用的内存管理机制,分析常见的内存泄漏问题,并提出一系列实用的内存优化技巧。通过这些策略的实施,开发者可以显著减少应用的内存占用,避免不必要的后台服务,以及提高垃圾回收效率,从而延长设备的电池寿命并确保应用的流畅运行。
|
29天前
|
缓存 Linux iOS开发
【C/C++ 集成内存调试、内存泄漏检测和性能分析的工具 Valgrind 】Linux 下 Valgrind 工具的全面使用指南
【C/C++ 集成内存调试、内存泄漏检测和性能分析的工具 Valgrind 】Linux 下 Valgrind 工具的全面使用指南
64 1
|
30天前
|
缓存 移动开发 Java
构建高效Android应用:内存优化实战指南
在移动开发领域,性能优化是提升用户体验的关键因素之一。特别是对于Android应用而言,由于设备和版本的多样性,内存管理成为开发者面临的一大挑战。本文将深入探讨Android内存优化的策略和技术,包括内存泄漏的诊断与解决、合理的数据结构选择、以及有效的资源释放机制。通过实际案例分析,我们旨在为开发者提供一套实用的内存优化工具和方法,以构建更加流畅和高效的Android应用。
|
1月前
|
缓存 测试技术 开发工具
内存泄漏检测工具Valgrind:C++代码问题检测的利器(二)
内存泄漏检测工具Valgrind:C++代码问题检测的利器
35 0
|
1月前
|
监控 Java Android开发
构建高效Android应用:从内存管理到性能优化
【2月更文挑战第30天】 在移动开发领域,打造一个流畅且响应迅速的Android应用是每个开发者追求的目标。本文将深入探讨如何通过有效的内存管理和细致的性能调优来提升应用效率。我们将从分析内存泄露的根本原因出发,讨论垃圾回收机制,并探索多种内存优化策略。接着,文中将介绍多线程编程的最佳实践和UI渲染的关键技巧。最后,我们将通过一系列实用的性能测试工具和方法,帮助开发者监控、定位并解决性能瓶颈。这些技术的综合运用,将指导读者构建出更快速、更稳定、用户体验更佳的Android应用。
|
1月前
|
缓存 监控 API
构建高效的Android应用:从内存优化到电池寿命
【2月更文挑战第27天】 在移动开发领域,构建一个既高效又省电的Android应用是每个开发者的梦想。本文深入探讨了Android应用性能优化的关键策略,包括内存管理和电池使用效率。我们将分析常见的内存泄漏问题,并提供解决方案,同时介绍最新的Android电池优化技术。通过实例和最佳实践,读者将学会如何打造一个更加流畅、响应迅速且电池友好的Android应用。
|
1月前
|
传感器 缓存 Android开发
构建高效的Android应用:从内存优化到电池寿命
【2月更文挑战第23天】在移动开发领域,性能优化是一个持续的挑战。特别是对于Android应用来说,由于设备多样性和碎片化问题,开发者需要采取一系列策略来保证应用的流畅运行。本文深入探讨了Android应用的性能优化,包括内存管理、电池使用效率和UI渲染。我们将提供实用的技巧和最佳实践,帮助开发者构建更加高效、响应迅速的应用,从而改善用户体验并延长设备电池寿命。
14 1