当前位置:首页 > 内存 > 正文

内存溢出和内存越界(内存溢出会导致什么后果)

  • 内存
  • 2024-06-09 21:25:49
  • 5656

一、导致内存溢出的原因有哪些?内存溢出问题又如何解决

之前小编给大家介绍过内存溢出错误的含义。那么,肯定有网友会问内存溢出是什么原因造成的呢?如何解决内存溢出问题?别着急,小编再次和大家分享一下内存溢出的原因和解决办法。

内存溢出的原因及解决办法

内存溢出的原因有很多,小编将列出以下常见原因:

1。加载到内存的数据量太大,比如一次从数据库中取出太多数据

2、集合中有对象的引用;class使用后没有删除,导致JVM无法回收

3、代码中存在死循环或者循环创建过多重复的对象实体

;4.使用的第三方软件出现错误;

5、启动参数内存值设置太小

内存溢出的解决办法:

首先这一步是修复更改JVM启动参数,增加内存直接地。(记得添加-Xms和-Xmx参数。)

第二步是检查错误日志,看看在“OutOfMemory”错误之前是否有异常或其他错误。

第三步,审查分析代码,找出哪里可能发生内存溢出。

重点关注以下几点:

1.检查数据库查询中是否有查询一次性检索到所有数据。一般来说,如果一次加载十万条记录到内存中,就会导致内存溢出。这个问题比较隐蔽。上线之前,数据库数据较少,不太容易出现问题。一旦上线,数据库中的数据就会增多,单个查询就可能导致内存溢出。因此尝试使用分页进行数据库查询。

2.检查代码中是否存在无限循环或递归调用。

3.检查是否有一个大周期不断创建新的对象实例。

4.检查数据库查询中是否有任何查询一次性获取所有数据。一般来说,如果一次加载十万条记录到内存中,就会导致内存溢出。这个问题比较隐蔽。上线之前,数据库数据较少,不太容易出现问题。一旦上线,数据库中的数据就会增多,单个查询就可能导致内存溢出。因此尝试使用分页进行数据库查询。

5.检查List、MAP等集合对象使用后是否被删除。List、MAP等集合对象总会有对象的引用,使得这些对象无法被GC回收。

第四步,使用内存查看器动态查看内存使用情况


二、内存泄露,内存越界和栈溢出的区别和联内存溢出(OutofMemory)是指程序在申请内存时没有足够的内存空间可以使用。
内存泄漏
是指程序通过申请内存而占用了有用的内存,然后无法释放所申请的内存空间。
注意:内存泄漏最终会导致内存溢出。
简单来说,内存溢出就是需要分配的内存超过了系统提供的内存。内存泄漏是指系统分配内存供使用(新建)但使用后不归还(删除),占用可用内存。
内存泄漏可分为四种类型。
1.频繁内存泄漏
导致内存泄漏的代码被多次执行,每次执行都会发生内存泄漏。漏水
2.间歇性内存泄漏
如果在某些特定环境下运行导致内存泄漏的代码,就会发生内存泄漏。
在上述两种内存泄漏方法中,测试环境和测试方法很重要。它对于程序的生命周期是不可或缺的。
3.一次性内存泄漏
代码只运行一次,但总是会导致内存泄漏。这种情况在构造类且析构函数不释放内存时更为常见。
4.隐式泄漏
内存在程序运行时不断分配,直到程序退出时才会释放。然而,服务器程序通常会运行很长时间并且无法关闭。随着时间的推移,内存泄漏也会发生。
综上所述,一次性的内存泄漏不会对用户维护程序的能力造成太大伤害,但在现实生活中,我们会尽量避免此类事件的发生。
超出内存范围
是指向系统申请内存后,使用时超出了申请范围。例如,有一些对内存进行操作的函数(sprintf、strcpy、strcat、vsprintf、memcpy、memset、memmove)。当执行导致内存泄漏的代码时,发生的错误是不可避免的,通常是
1。销毁堆中的内存分配信息数据。
2.破坏程序内其他对象的内存。
3.删除一块空闲内存
附:之前程序运行正常,但是因为你添加了几个新的类的成员变量或者修改了部分代码(前提是这些修改完全正确))导致程序运行不正常发生这种情况时,请考虑内存是否已损坏,并重点确定内存是否越界。
缓冲区溢出(堆栈溢出)
程序通常会分配称为缓冲区的内存空间来临时访问数据。如果将缓冲区无法容纳的数据写入缓冲区,则可能会覆盖缓冲区外部的存储单元,这称为缓冲区溢出。堆栈溢出是缓冲区溢出的一种,原理是一样的。分为上溢和下溢。其中,上溢是指栈满了,有新的数据加入,造成数据溢出,而下溢是指栈为空,进行了删除操作等,造成空间溢出。