java jvm 内存溢出和内存泄漏的区别是什么

发布时间:2021-07-14 10:49:06 作者:chen
来源:亿速云 阅读:210

这篇文章主要介绍“java jvm 内存溢出和内存泄漏的区别是什么”,在日常操作中,相信很多人在java jvm 内存溢出和内存泄漏的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java jvm 内存溢出和内存泄漏的区别是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

1、概念的区分

内存溢出 out of memory

是指程序在申请内存时,没有足够的内存空间供其使用,出现 out of memory 。

比如申请了一个10MB 空间, 但是当前内存只有5MB,那就是内存溢出。

javadoc 对 OutOfMemoryError 的解释是, 没有空闲内存,垃圾收集器也无未能提供更多的内存空间 。

java jvm 内存溢出和内存泄漏的区别是什么

内存泄露 memory leak

是指程序运行结束后,没有释放已所占用的内存空间,一次内存泄漏 似乎不会有大的影响,但内存泄漏 堆积后的后果就是 内存溢出。
java jvm 内存溢出和内存泄漏的区别是什么

1)单例模式

单例的生命周期和应用程序是一样长的,所以单例程序中如果持有对外部对象的引用的话,那么这个外部对象是不能被回收的,则会导致内存泄露的产生。

2)一些提供close的资源未闭导致内存泄漏

数据库连接(dataSource.getConnection() ),网络连接(socket)和 IO流的连接必须在finally中 close,否则不能被回收的。

2、二者的关系:

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

3.1、内存溢出的原因

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

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

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

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

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

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

3.2、内存溢出的解决方案:

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

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

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

重点排查以下几点:

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

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

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

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

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

到此,关于“java jvm 内存溢出和内存泄漏的区别是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

推荐阅读:
  1. Java中的内存泄露与内存溢出是什么?为什么会出现内存溢出和内存泄露?
  2. java中的内存溢出与内存泄漏是什么

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java jvm

上一篇:Ubuntu下删除模拟器失败提示the android XXX virtule怎么办

下一篇:Linux中怎么利用系统库文件来降低工作

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》