内存泄漏与内存溢出汇总

区别

1、内存泄漏:程序在申请内存空间之后,无法释放已经申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
2、内存溢出( out of memory),是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。
3、

相同点:都会导致应用程序运行出现问题,性能下降或挂起。
不同点:

  1. 内存泄露是导致内存溢出的原因之一;内存泄露积累起来将导致内存溢出。
  2. 内存泄露可以通过完善代码来避免;内存溢出可以通过调整配置来减少发生频率,但无法彻底避免。

内存泄漏导致原因

(1)静态集合类,例如HashMap和Vector。如果这些容器为静态的,由于它们的生命周期与程序一致,那么容器中的对象在程序结束之前将不能被释放,从而造成内存泄露。
(2)各种连接,例如数据库连接、网络联接以及IO连接等。在对数据库进行操作的过程中,首先需要建立与数据库的连接、当不再使用时,需要调用close方法来释放与数据库的连接。只有连接被关闭后,垃圾回收器才会回收对应的对象。否则,如果在访问数据库的过程中,对Connection、Statement或ResultSet不显示地关闭,将会造成大量的对象无法被回收,从而引起内存泄露。
(3)监听器。在Java语言中,往往会使用到监听器。通常一个应用中会用到多个监听器。但在释放对象的同时往往没有相应地删除监听器,这也可能导致内存泄露。
(4)变量不合理的作用域。一般而言,如果一个变量定义的作用范围大于其使用范围,很有可能会造成内存泄露,另一方面如果没有及时地把对象设置为null,很有可能会导致内存泄露的发生。

内存泄漏解决方案

通过性能检测工具查找内存泄漏,如果内存大小持续增长,系统存在内存泄漏

  1. 尽早释放无用对象的引用。
    好的办法是使用临时变量的时候,让引用变量在退出活动域后自动设置为null,暗示垃圾收集器来收集该对象,防止发生内存泄露。
  2. 程序进行字符串处理时,尽量避免使用String,而应使用StringBuffer。 因为每一个String对象都会独立占用内存一块区域
  3. 尽量少用静态变量。因为静态变量是全局的,GC不会回收。
  4. 不要在经常调用的方法中创建对象,尤其是忌讳在循环中创建对象。
    可以适当的使用hashtable,vector创建一组对象容器,然后从容器中去取那些对象,而不用每次new之后又丢弃。
    5) 尽量运用对象池技术以提高系统性能。生命周期长的对象拥有生命周期短的对象时容易引发内存泄漏,例如大集合对象拥有大数据量的业务对象的时候,可以考虑分块进行处理,然后解决一块释放一块的策略。

内存溢出导致原因

1、内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
2、集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
3、代码中存在死循环或循环产生过多重复的对象实体;
4、使用的第三方软件中的BUG;
5、启动参数内存值设定的过小

内存溢出解决方案

第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)
第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。
第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。

内存溢出类型(OOM异常)

1、虚拟机栈:
(1)虚拟机栈和本地方法栈溢出(StackOverflowError)线程请求的栈深度大于虚拟机允许的最大深度
(2)OOM:虚拟机扩展栈的时候无法申请到足够的内存空间
2、堆
OOM:java heap spaces
先使用内存映像分析工具分析,如果是内存泄漏:找到泄漏对象通过怎样的路径与GCRoot相连,是得无法回收
如果是内存溢出:检查虚拟机参数设置是否合适
3、方法区:OOM:PermGen space:方法区无法满足内存分配
4、运行常量池:OOM(jdk1.7 PermaGen sapce ;jdk1.8:java heap):常量池无法申请到 内存
5、直接内存:各个内存区域总和大于物理内存限制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值