谈谈内存溢出与内存泄漏的关系?
内存泄漏是申请了内存用完了不释放,内存溢出是申请内存时,没有足够的内存可以使用。
内存泄漏最终会导致内存溢出,也可以说内存泄漏是内存溢出的一种。
谈谈引起内存溢出的原因有哪些?
1、内存中加载的数据量过于庞大,如一次从数据库取出过多数据
2、集合类中有对对象的引用,使用完未清空,使得JVM不能回收
3、代码中存在死循环或循环产生过多重复的对象实体
4、使用的第三方软件中的BUG
5、启动参数内存值设置的过小
如果是你如何来解决?以及后续如何来避免?
如何解决:
第一步,修改JVM启动参数,直接增加内存
第二步,检查错误日志,查看“OutOfMemory”错误前是否有其他异常或错误
第三步,对代码进行走查和分析,找出可能发生内存溢出的位置
重点检查以下几点:
1、检查代码中是否有死循环或递归调用
2、检查是否有循环重复产生新对象实体
3、检查对数据库查询中,是否有一次获得全部数据的查询
4、检查List、Map等集合对象是否有使用完,未清除的问题
第四步,使用内存查看工具动态查看内存使用情况
内存溢出绝大部分时候都是源码层面的问题,在开发过程中需要注意的点有:
1 、尽早释放无用对象的引用
2 、程序里不可避免大量使用字符串时,避免使用String,应大量使用StringBuffer,每一个String对象都得独立占用内存一块区域
3 、尽量少用静态变量,因为静态变量是全局的,GC不会回收的
4 、避免集中创建对象尤其是大对象,JVM 会突然需要大量内存,这时必然会触发GC优化系统内存环境;如显式的声明数组空间,而且申请数量还极大
5 、尽量运用对象池技术以提高系统性能
6 、不要在经常调用的方法中创建对象,尤其是忌讳在循环中创建对象
7 、一般都是发生在开启大型文件或跟数据库一次拿了太多的数据,造成Out Of Memory Error的状况,这时就大概要计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值。