- 内存溢出 指程序要求的内存超出了系统所能分配的范围,出现out of memory;比如申请一个long类型,但给了它一个int才能存放的数,就会出现内存溢出,或者是创建一个大的对象,而堆内存放不下这个对象,这也是内存溢出。对于内存溢出在Java中有俩种溢出, 一个是栈溢出, 一个是堆溢出, 其本质是一样的都是由于内存不够造成的
因此,我们从上面也可以推断出内存泄露可能会导致内存溢出。内存溢出会抛出异常,内存泄露不会抛出异常,大多数时候程序看起来是正常运行的。
public class demo {//内存泄露案例
public static void main(String[] args) {
List v = new ArrayList<>(1000);
for (int i = 1; i<1000; i++)
{
Object o = new Object();
v.add(o);
o = null;
}
}
}
public class demo {//内存溢出案例
public static void main(String[] args) {
List list=new ArrayList<>();
while(true){//申请的内存过大
int[] temp=new int[1000];
list.add(temp);
}
}
}
-
上面内存内存泄漏就很明显, 即使我们将o置为null, 但是在list中, 还是有一个强引用 引用着它, 并没有进行一个真正的回收
-
内存溢出就是我们疯狂创建对象, 直到堆内存使用完
-
使用了大量的递归或无限递归, 因为每调用一个方法就会给栈中压入一个栈帧, 死递归式的加栈帧, 就会造成栈内存不够而出现溢出
-
使用了大量循环或死循环(如循环中不停调用方法)所以本质上还是疯狂的调用方法
-
使用了大量的递归或无限递归(递归中用到了大量的新建的对象)
-
使用了大量循环或死循环(循环中用到了大量的新建的对象)
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频**
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-ZB9Q9upe-1710822383274)]