什么是内存泄露
内存泄漏是指无用对象(未被任何引用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏。内存泄露有时不严重且不易察觉,这样开发者就不知道存在内存泄露,但有时也会很严重。
Java内存泄漏的根本原因是长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏,尽管短生命周期对象已经不再需要,但是因为长生命周期持有它的引用而导致不能被回收。
什么是内存溢出
内存溢出异常,即程序需要内存超出了虚拟机可以分配内存的最大范围。在Java 虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他区域都可能发生异常
常见的内存溢出分为以下几种:
1.堆溢出
Java 堆用于存储对象实例,只要不断地创建对象,并且保证垃圾回收机制清除这些对象,那么在对象数量达到最大堆限制就会产生内存溢出异常。
比如这段代码
public class Test{
List list = new ArrayList();
public static void main(String args[]){
while(true){
Test test = new Test();
list.add(test);
}
}
}
此时test对象是被引用的,有根的存在。Java虚拟机的垃圾回收机制是回收为被任何引用或无法找到该对象的根才会进行回收。此时test对象未被回收,又一直不断的自我增长,到达虚拟机内存最大值时就会造成内存溢出
2.栈溢出
是因为栈帧是一层一层无限调用到达内存最大值导致的内存溢出
在虚拟机栈中,栈帧调用是从最低层(main方法或者说入口)进行调用。但是如果调用栈帧到达内存最大值就会报出栈帧异常,也就是栈帧溢出
像这种。
一般最容易出现的就是递归方法中,所以如果出现类似异常或内存溢出泄露等,请好好回去看一看是不是代码出现了调用死循环等错误。
好了,先讲到这里,要是有不对欢迎指出,这篇文章不定时编辑更新。