概念
内存溢出(out of memory)是因为在内存中创建了大量在引用的对象和变量,导致程序后续再申请内存时没有足够的内存空间供其使用。
内存泄露(memory leak)是指程序申请完内存后,无法释放已申请的内存空间,(不再使用的对象或者变量仍占内存空间)。
两者的联系
- 一次内存泄漏不会有大的影响,但内存泄漏堆积后的最终会导致内存溢出。
- 内存溢出就是你要的内存空间超过了系统实际分配给你的空间,此时系统相当于没法满足你的需求,就会报内存溢出的错误。
- 内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。
内存溢出的原因及解决方法
内存溢出原因:
- 内存中加载的数据量过于庞大,如一次从数据库取出过多数据。
- 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;。
- 代码中存在死循环或递归调用,产生过多重复的对象。
- 使用的第三方软件中的BUG。
- JVM内存参数值设定的过小。
内存溢出的解决方案:
- 修改JVM启动参数,直接增加内存,(-Xms,-Xmx参数)。
- 检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。
- 对代码进行走查和分析,找出可能发生内存溢出的位置。
- 使用内存查看工具动态查看内存使用情况。