内存溢出和内存泄漏的区别,产生原因以及解决方案

内存溢出和内存泄漏的区别,产生原因以及解决方案,第1张

内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。

内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

memory leak会最终会导致out of memory!

内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。

内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。一个盘子用尽各种方法只能装4个果子,你装了5个,结果掉倒地上不能吃了。这就是溢出!比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出

以发生的方式来分类,内存泄漏可以分为4类:

1 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。

2 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或 *** 作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。

3 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。

4 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。

从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到

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

引起内存溢出的原因有很多种,小编列举一下常见的有以下几种:

1内存中加载的数据量过于庞大,如一次从数据库取出过多数据;

2集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;

3代码中存在死循环或循环产生过多重复的对象实体;

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

5启动参数内存值设定的过小

内存溢出的解决方案:

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

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

第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。

重点排查以下几点:

1检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。

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

3检查是否有大循环重复产生新对象实体。

4检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。

5检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。

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

云存储配置错误继续困扰着数据隐私领域,数据显示,在网络上的数百万人的就业和健康信息流露在网络等地方,换句话理解,数据对任何互联网人都是敞开的。

近日,美国有家著名招聘公司Ladders,由于其中一个配置错误的数据库显示出勒索软件攻击的证据,导致泄露公司的大量的个人身份信息(PII):Ladders猎头和招聘网站以用户信息。

此公司是使用的是亚马逊云数据库,其中包含1370万用户的就业信息,其中包括姓名,电子邮件地址,实际地址和电话号码。它还包括典型的简历费用,例如就业历史,在某些情况下还包括详细的职位描述,它还列出了安全许可。

发生数据泄露事件后,公司的首席执行官与AWS服务提供商确认了,管理d性搜索是安全的,只有内部员工才可以在指定的IP地址访问。没有关于信息暴露多长时间或是否被访问的消息。

无独有偶。与此同时,美国另外一个属于佛罗里达州医疗公司的无担保Elasticsearch数据库。它包含136,995个明文记录,信息遭到大规模泄露。

在数据库内部是每个成员的文件,其中包含个人身份信息,一些账户有医疗信息或关于用户的注释,这是一个设置为'打开'并在任何浏览器中可见的d性数据库(可公开访问),任何人都可以编辑,下载甚至删除没有管理凭据的数据。

数据库中存在的证据,这可能是更大曝光的证据。即使有潜伏的这种可能性,公司在无能为力,尽管数据库在发送信息后仍然是安全的。

令人遗憾的是,尽管高调的事件似乎每天都在涌现,但云配置问题仍可能继续存在:许多企业仍然不了解共享责任模型,像AWS这样的云提供商负责保护云基础架构本身,但数据所有者负责保护他们选择在云中托管的信息的机密性,完整性和可用性。

但最重要的是,这是用户个人信息的数据,无论是否属于隐私法规,企业有责任在云环境中保护它。公司还应该从错误配置很常见的角度来看待云存储安全性,如果不可能的话。

没有人是完美的,每个人都会犯错误,所以偶然的内部威胁对于控制是很重要的。当然,恶意行为者可能想从公司获取知识产权,但数据曝光的大部分往往是偶然的。

数据库所有安全性都可保证,但数据是否依旧有泄漏的危险

网络数据库的安全机制数据库的安全性是指保护数据库以防止非法使用所造成的数据泄密、更改或破坏安全性控制的方法安全性控制是指要尽可能地杜绝任何形式的数据库非法访问。常用的安全措施有用户标识和鉴别、用户存取权限控制、定义视图、数据加密、安全审计以及事务管理和故障恢复等几类

以上就是关于内存溢出和内存泄漏的区别,产生原因以及解决方案全部的内容,包括:内存溢出和内存泄漏的区别,产生原因以及解决方案、配置错误可导致数百万用户信息泄露,云存储现在真的安全吗、数据库所有安全性都可保证,但数据是否依旧有泄漏的危险等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9354774.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存