专栏首页Java程序员那些事内存溢出和内存泄漏的区别

内存溢出和内存泄漏的区别

1.内存溢出(out of memory)与内存泄露(memory leak)

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

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

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

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

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

(1) 内存溢出原因:

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

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

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

第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。重点排查以下几点:

  1. 检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
  2. 检查代码中是否有死循环或递归调用。
  3. 检查是否有大循环重复产生新对象实体。
  4. 检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
  5. 检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。

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

本文分享自微信公众号 - Java程序员那些事(zgsoft44),作者:Java程序员那些事

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 关于Java底层Long类型源码的分析

    1.首先,Long类型的数值,是根据大小进行处理的。当数值大小范围在-128到127之间时,为了节省开销,引用的是LongCache缓存中的数据。在此范围外的...

    用户6182664
  • Java中的IO流知识总结

    1、是文件: FileInputStream, FileOutputStream, FileReader, FileWriter

    用户6182664
  • Mysql的事务的隔离级别

    mysql事务,依次为Read uncommitted(读未提交) 、Read committed(读已提交) 、Repeatable read(可重复读) 、...

    用户6182664
  • Java内存模型

    在Java虚拟机中定义了一种内存模型也就是JMM。目的是屏蔽各种硬件和操作系统的内存差异,以解决Java跨平台时能达到统一的内存访问效果。下面我们了解一下在JM...

    吉林乌拉
  • R语言内存的管理

    R语言中内存是我们平时不怎么注意的一个方面,但是R语言的内存占有率还是很高的。尤其是在对大型数据的处理过程中,每当你复制你的变量或者创建新的变量都会占用新的内存...

    一粒沙
  • 重学计算机组成原理(八)- 程序的装载

    比尔·盖茨在上世纪80年代说的“640K ought to be enough for anyone”

    JavaEdge
  • Netty 堆外内存的管理

    本篇文章我们将进入 Netty 内存管理的学习,在此之前,我们需要了解 Java 堆外内存的基本知识,因为当你在使用 Netty 时,需要时刻与堆外内存打交道。...

    MickyInvQ
  • Java基础-数组原理内存图

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明...

    cwl_java
  • MMU那些事儿

    [导读] 本文从内存管理的发展历程角度层层递进,介绍MMU的诞生背景,工作机制。而忽略了具体处理器的具体实现细节,将MMU的工作原理从概念上比较清晰的梳理了一遍...

    逸珺
  • 内存溢出和内存泄露

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

    Demo_Yang

扫码关注云+社区

领取腾讯云代金券