您当前的位置:首页 > 养生 > 内容

内存溢出的原因以及解决方法有哪些_内存溢出的原因以及解决方法

内存溢出的原因以及解决方法有哪些_内存溢出的原因以及解决方法

内存溢出是指当一个程序申请内存时,没有足够的内存空间供它使用,内存不足;出现;比如你申请了一个整数,但是你存了一个长数,那就是内存溢出。

内存溢出是指你索取的内存超过了系统能给你的,系统满足不了需求,所以发生了溢出。

内存泄漏是指你向系统申请分配内存使用(new),但使用后不归还(delete)。这样一来,你就无法访问你自己申请的内存(可能你把它的地址弄丢了),系统也无法再把它分配给需要的程序。一个盘子只能用各种方式装四个水果。你在里面放了五个水果,掉在地上吃不到。这是溢出!比如stack,当栈满的时候,必然会产生空间溢出,称为溢出,当栈空的时候,也会产生空间溢出,称为下溢。就是分配的内存不够放下数据项序列,这叫内存溢出。

根据发生的方式,内存泄漏可以分为四类:

1.频繁的内存泄漏。有内存泄漏的代码会被多次执行,每次执行都会导致内存泄漏。

2.偶尔内存泄漏。内存泄漏的代码只会发生在特定的环境或操作过程中。复发和偶然性是相对的。对于特定的环境,偶发性可能会变成复发性。因此,测试环境和测试方法对于检测内存泄漏非常重要。

3.一次性内存泄漏。有内存泄漏的代码只会执行一次,或者因为算法的缺陷,总会有一个且只有一个内存泄漏。比如内存是在类的构造函数中分配的,但是在析构函数中没有释放,所以内存泄漏只会发生一次。

4.隐式内存泄漏。程序在运行过程中不断分配内存,但直到最后才释放内存。严格来说,这里不存在内存泄漏,因为程序最终释放了所有应用的内存。然而,对于一个服务器程序来说,它需要运行几天、几周甚至几个月。未能及时释放内存可能最终导致系统所有内存的耗尽。因此,我们将这种内存泄漏称为隐式内存泄漏。

从用户使用程序的角度来看,内存泄露本身不会造成任何伤害。作为一般用户,内存泄露根本不存在。真正有害的是内存泄漏的积累,最终会消耗掉系统的所有内存。从这个角度来说,一次性内存泄漏是无害的,因为它不会累积,而隐式内存泄漏是非常有害的,因为它比频繁和偶然的内存泄漏更难检测。

内存泄漏内存泄漏是指一个程序在申请内存后无法释放申请的内存空间,一次内存泄漏的危害可以忽略不计,但是内存泄漏累积的后果是非常严重的,无论多少内存,迟早都会被占用。

内存泄漏最终会导致内存不足!

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

内存溢出的原因有很多。边肖列举了以下常见的例子:

1.内存加载的数据量太大,比如一次从数据库取数据太多;

2.集合类中存在对对象的引用,使用后没有清空,使得JVM无法回收;

3.代码中存在无限循环或循环导致的对象实体重复过多;

4.BUG在使用的第三方软件中;

5.启动参数存储器值设置得太小。

内存溢出的解决方案:

第一步是修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不能忘记添加。)

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

第三步是遍历并分析代码,找出可能发生内存溢出的地方。

重点关注以下几点:

1.检查是否存在获取数据库查询中所有数据的查询。一般来说,如果一次将100,000条记录提取到内存中,可能会导致内存溢出。这个问题是隐藏的。在上线之前,数据库里的数据比较少,不容易出问题。上线后,数据库中的数据比较多,一个查询就可能造成内存溢出。因此,数据库查询应该尽可能分页。

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

3.检查是否有大循环反复生成新的对象实体。

4.检查List、MAP等集合对象是否存在使用后未清除的问题。像List和MAP这样的集合对象总是有对对象的引用,所以这些对象不能被GC回收。

第四步,使用内存查看工具动态查看内存使用情况。

这里推荐几个检查内存泄漏的软件:

审计唐子红

标签:内存程序代码


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: 索尼xz2c(索尼xz2c设置电信卡上网!按网上*#*#4636#*#*设置only.设置用不了!怎么办!)

下一篇: 诺基亚1050保密码忘了怎么办(诺基亚手机开机显示要输入保密码,忘记了怎么办)



猜你感兴趣

推荐阅读

网站内容来自网络,如有侵权请联系我们,立即删除! | 软文发布 | 粤ICP备2021106084号