Android内存泄漏分析

内存泄漏的概念,引用当初面试的时候总结出来的一句话:当对象使用完需被回收时,因为有存在它的引用而无法被GC回收,就会出现内存泄漏(当面试官跟你撕逼内存泄漏的时候就一句话怼死他);

首先我们要知道内存是个什么概念。我们知道java在jvm虚拟机中运行,而jvm虚拟机可划分为三个区:栈、堆和方法区。

jvm记录了方法的调用,每个线程都会拥有一个自己的栈,当程序运行时,调用方法,方法入栈,保存了这个方法的参数。局部变量和返回的对象的地址值。在java中,局部变量基本数据类型变量或者是对象的引用。所以,对象的引用只能保存在堆中。

当方法被调用完毕,该方法就会从栈中弹出,所有局部变量和参数占用的控件被释放掉。同理,当所有的栈都被清空的时候(方法调用完毕),程序也就运行结束了。

对于堆内存而言,它里面存放着一些普通变量,而java的机制是堆内存不会随着方法的解释而将内存清空,所以在方法中定义了局部变量的,在方法结束后依然会存活在堆中。

所以,我们知道了,栈可以自己清理内存空间。而堆不会。那么,当我们不停地new对象的时候,堆的内存就会有被占满的可能。所以java引入了GC(垃圾回收器),去处理堆中内存的回收。可悲的是,尽管栈被清空了,但是如果对象的引用一直不被销毁,就会占据着内存,这块内存就没有了它的意义,不能再使用,所以就出现了我们文章开头的那一句:当对象使用完需被回收时,因为有存在它的引用而无法被GC回收,就会出现内存泄漏。

我们知道,java中的引用类型分为强引用,弱引用,软引用和虚引用。

而正在造成内存泄漏的,正是强引用;

所以,内存泄漏的真正原因是:

持有对象的强引用,无法被GC回收。

以上就是我所了解到的内存泄漏的原因,希望对大家有点点帮助。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值