java内存泄漏和内存溢出这两个概念一直是行业痛点。这两个概念容易混淆。笔者也是查阅了一些资料后。对这两个概念进行了总结。
1、什么是内存泄漏?
应用程序不再需要占用内存的时候,由于某些原因,内存没有被操作系统或可用内存池回收。
比如我们在一个代码块里创建了两个个对象A和B,对象B里引用了对象B,对象A的生命周期要比对象B的生命周期要短很多。在对象A生命周期结束后,对象B的生命周期未结束。那么垃圾回收机制,无法对生命周期已经结束的A对象进行内存回收。这个时候我们就把这种现象叫做内存泄漏。
JVM栈内存溢出代码
public static void testStackOutOfMemory(){
while (true) {
Thread testStackOut = new Thread(new Runnable() {
public void run() {
while(true){
}
}
});
testStackOut.start();
}
}
2、什么是内存溢出?
是指程序运行过程中申请的内存超过了系统能够提供的最大内存,导致程序无法正常运行。这种情况通常发生在系统配置、数据流或用户代码等原因导致的内存需求超过系统分配的内存时,即使重新执行任务也无法避免。
内存溢出与内存泄漏是两个不同的概念。内存泄漏是指程序分配的内存没有被正确释放,导致内存被长期占用而无法用于其他用途。相比之下,内存溢出是程序尝试申请的内存量超过了系统可提供的最大内存量,导致程序无法继续运行。
处理内存溢出的方法包括优化系统配置、减少数据流中的内存使用、检查并修改用户代码等。通过这些措施,可以减少程序对内存的需求,从而避免内存溢出错误