了解内存泄漏的根源

Posted xiaohuanqi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了了解内存泄漏的根源相关的知识,希望对你有一定的参考价值。

博客转移至个人站点:http://www.wangchengmeng.club/

欢迎来吐槽

优化是老生常谈的一个问题,也是一个广泛的概念,谈优化必不可少的就是内存优化,从而牵涉到内存泄漏和内存溢出等问题,关于内存泄漏的文章很多,再次复习一下,怎么去看代码是否会有内存泄漏,以及要怎么去解决。

1.什么是内存泄漏?

简单来说就是内存不在GC的掌控之内了,比如某个页面被销毁但是其中对象还持有该引用不能被回收仍然占有内存空间。

2.Gc回收机制:

某对象不再持有任何引用的时候才会进行回收

3.怎么去判断一个对象是否可回收?

先看一张图:

一个对象是否可以被回收大家都知道的是看该对象是否还持有引用,究竟是持有谁的引用呢?一般情况吧某对象致为null的时候该对象是可以被回收,但有些持有引用层次比较多的,就应该根据这张图仔细分析一下了。没有被GcRoot引用点引用的对象,即是可以被回收的对象,反之被GcRoot引用点引用的对象不可以被回收。

可以作为GCroot的引用点:

        1.JavaStack中的引用对象
        2.方法区中的静态引用指向的对象
        3.方法区中常量引用指向的对象
        4.Native方法中JNI引用的对象
        5.Thread---“活着的”线程
根据这个流程去查看某对象是否可以被回收,去了解项目组容易内存泄漏的原因。

常见的内存泄漏情况:

1.内部类持有外部类的引用(建议使用静态内部类)
2.Context的泄漏(生命周期过长的情况建议使用ApplicationContext)
3.单例模式使用Context
4.Handler的使用
5.线程的不合理利用(建议使用线程池)
6.资源使用完毕没有close
等等,开发中还有很多不经意的内存泄漏,仔细分析
关于解决内存泄漏的方法很多 比如heap(http://blog.csdn.net/xiaohuanqi/article/details/52001580[使用heap],以及各种开源工具,例如LeakCanary。

以上是关于了解内存泄漏的根源的主要内容,如果未能解决你的问题,请参考以下文章

玩点深入的:Java 虚拟机内存结构及编码实战

Android性能优化内存泄漏与排查流程,6年老Android经验总结

Android性能优化内存泄漏与排查流程,6年老Android经验总结

关于内存泄漏

ExtJS4 内存泄漏

正确使用pthread_create,防止内存泄漏