内存泄漏总结

原创 2018年04月16日 09:04:37

垃圾回收

垃圾回收机制

可以作为Gc Root引用的点的是

  1. JavaStack中引用的对象
  2. 方法区中静态引用指向的对象
  3. 方法区中常量引用指向的对象
  4. Native方法中JNI引用的对象

确定是否存在内存泄漏

查看Android Profile ,点击Dump Java Heap,然后我们就可以在下面的区域看到每个对象所占有的内存情况


如果想对结果进行过滤,可以点击右侧的Filter,例如我们想查看我们应用的内存情况,可以输入包名


下面是某个具体类所占用的内存情况,其中Allocations代表内存中总共为多少个对象分配了内存,


下面我们做一个内存泄漏的测试,代码如下

public class TimeActivity extends AppCompatActivity {
    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Toast.makeText(TimeActivity.this, "收到", Toast.LENGTH_SHORT).show();
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_time);
    }

    public void send(View view){
        handler.sendEmptyMessageDelayed(0,10000);
    }
}

每次打开页面,我们发送一个延迟消息,然后重复几次,这时候进行内存分析,可以看到如下的结果


内存中出现了三个Activity的实例,说明发生了内存泄漏,我们也可以用命令行来查看当前内存的情况

adb shell dumpsys meminfo 包名 -d

结果如下

Applications Memory Usage (in Kilobytes):
Uptime: 15584464 Realtime: 32865994

** MEMINFO in pid 10619 [practice.lxn.cn.androidpractice] **
                   Pss  Private  Private  SwapPss     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------
  Native Heap     6478     6428        0        0    12800     8998     3801
  Dalvik Heap     2778     2696        0        0    10481     6385     4096
 Dalvik Other      620      616        0        0
        Stack      220      220        0        0
       Ashmem       55        4        0        0
    Other dev        5        0        4        0
     .so mmap     1560      160      272       37
    .apk mmap      183        0       48        0
    .ttf mmap       23        0        8        0
    .dex mmap     2048        4     2044        0
    .oat mmap     2002        0      308        0
    .art mmap     1755      884      220       11
   Other mmap       14        4        0        0
   EGL mtrack      103      103        0        0
    GL mtrack     4048     4048        0        0
      Unknown      510      508        0        1
        TOTAL    22451    15675     2904       49    23281    15383     7897

 App Summary
                       Pss(KB)
                        ------
           Java Heap:     3800
         Native Heap:     6428
                Code:     2844
               Stack:      220
            Graphics:     4151
       Private Other:     1136
              System:     3872

               TOTAL:    22451       TOTAL SWAP PSS:       49

 Objects
               Views:       68         ViewRootImpl:        1
         AppContexts:        6           Activities:        4
              Assets:        4        AssetManagers:        2
       Local Binders:       15        Proxy Binders:       21
       Parcel memory:        3         Parcel count:       15
    Death Recipients:        1      OpenSSL Sockets:        0

 Dalvik
         isLargeHeap:    false

 SQL
         MEMORY_USED:        0
  PAGECACHE_OVERFLOW:        0          MALLOC_SIZE:        0

下面说一下Shallow Size和Retain Size的区别:

Shallow Size是对象本身占据的内存的大小,不包含其引用的对象。对于常规对象(非数组)的Shallow Size由其成员变量的数量和类型来定,而数组的ShallowSize由数组类型和数组长度来决定,它为数组元素大小的总和。
Retained Size=当前对象大小+当前对象可直接或间接引用到的对象的大小总和。(间接引用的含义:A->B->C,C就是间接引用) ,并且排除被GC Roots直接或者间接引用的对象



版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Small_Lee/article/details/79955682

VC++内存泄漏检测方式方法总结

  • 2016年04月07日 09:51
  • 21KB
  • 下载

Android面试总结 内存泄漏总结

内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实例所持有却不再被使用导致 GC 不能回收...
  • jiankeufo
  • jiankeufo
  • 2017-09-14 11:36:22
  • 397

Java内存泄漏简单的分析总结

一、       理解Java内存回收机制  Java的内存管理就是对象的分配和释放问题。在Java中,内存的分配是由程序完成的,而内存的释放是由垃圾收集器(Garbage Collection,G...
  • xiaofeng10330111
  • xiaofeng10330111
  • 2016-11-04 14:00:37
  • 166

浅谈并小结java内存泄漏

一.定义 首先什么是内存泄漏,简单点说就是用完了忘了回收,而其他对象等资源想用却没法用的一种“站着茅坑不拉屎”的浪费资源的情况。在C/C++中,多数泄漏的场景就是程序离开某一运行域时,如在某个方法体中...
  • ganyao939543405
  • ganyao939543405
  • 2016-08-17 13:21:25
  • 2182

排查 Web App 的 JS 内存泄露小结

转载地址:https://testerhome.com/topics/3589 排查Web App的JS内存泄露小结 一、概述  所测试的项目是带角色交互的APP,其教师端是Hy...
  • wanglha
  • wanglha
  • 2015-11-10 10:07:11
  • 640

memleak 检测

  • 2011年01月25日 01:18
  • 2.8MB
  • 下载

微信团队原创分享:Android内存泄漏监控和优化技巧总结

前言 对于Android平台的应用程序来说,内存优化一直是个热门话题,与传统PC应用程序不同,Android上的应用一旦出现各种异常时系统默认会以最严厉的“崩溃”方式反馈给用户,如果处理不当,将...
  • BruceHurrican
  • BruceHurrican
  • 2017-03-21 14:32:01
  • 1057

内存泄漏2——C++中常见内存泄漏情形总结

出现内存泄露的情形: 1.类成员变量动态分配内存 类所有动态分配的成员变量,一定记得在析构函数中全部进行判断释放内存。当类中动态分配内存的成员一般是指针成员变量。 2.指针容器 使用std::...
  • haimianjie2012
  • haimianjie2012
  • 2017-02-22 20:27:04
  • 2342

内存泄漏与内存溢出总结

导读:本篇文章是最近几天关于内存优化的个人学习总结,从基础到日常常见的内存泄漏的顺序慢慢介绍…本编全文本,可能有些单调,不过认真看下来,肯定收益良多!如果急着解决,直接看 “常见的内存溢出处理”,”常...
  • u012792686
  • u012792686
  • 2017-04-08 12:14:00
  • 1201

内存泄漏的问题如何解决(linux)

内存泄漏的问题,在百度是遇到最多的,阿里相对少点。与内存泄漏斗争了很久,我总结下常用的一些有效测试方法吧。   1、valgrind,这是非常好用的工具,虽然参数很多,输出结果较多,但是只要认真看下,...
  • toothing
  • toothing
  • 2015-01-19 11:22:34
  • 1384
收藏助手
不良信息举报
您举报文章:内存泄漏总结
举报原因:
原因补充:

(最多只允许输入30个字)