内存泄漏的概念,引用当初面试的时候总结出来的一句话:当对象使用完需被回收时,因为有存在它的引用而无法被GC回收,就会出现内存泄漏(当面试官跟你撕逼内存泄漏的时候就一句话怼死他);
首先我们要知道内存是个什么概念。我们知道java在jvm虚拟机中运行,而jvm虚拟机可划分为三个区:栈、堆和方法区。
jvm记录了方法的调用,每个线程都会拥有一个自己的栈,当程序运行时,调用方法,方法入栈,保存了这个方法的参数。局部变量和返回的对象的地址值。在java中,局部变量基本数据类型变量或者是对象的引用。所以,对象的引用只能保存在堆中。
当方法被调用完毕,该方法就会从栈中弹出,所有局部变量和参数占用的控件被释放掉。同理,当所有的栈都被清空的时候(方法调用完毕),程序也就运行结束了。
对于堆内存而言,它里面存放着一些普通变量,而java的机制是堆内存不会随着方法的解释而将内存清空,所以在方法中定义了局部变量的,在方法结束后依然会存活在堆中。
所以,我们知道了,栈可以自己清理内存空间。而堆不会。那么,当我们不停地new对象的时候,堆的内存就会有被占满的可能。所以java引入了GC(垃圾回收器),去处理堆中内存的回收。可悲的是,尽管栈被清空了,但是如果对象的引用一直不被销毁,就会占据着内存,这块内存就没有了它的意义,不能再使用,所以就出现了我们文章开头的那一句:当对象使用完需被回收时,因为有存在它的引用而无法被GC回收,就会出现内存泄漏。
我们知道,java中的引用类型分为强引用,弱引用,软引用和虚引用。
而正在造成内存泄漏的,正是强引用;
所以,内存泄漏的真正原因是:
持有对象的强引用,无法被GC回收。
以上就是我所了解到的内存泄漏的原因,希望对大家有点点帮助。