Java内存溢出!!!

来源:互联网 发布:电压无功优化的目的 编辑:程序博客网 时间:2024/06/14 00:23

内存溢出的分析:
内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存。
为了解决这个问题,首先要分析Java是如何管理内存的:
Java的内存管理就是对象的分配和释放问题。
在Java中,内存的分配是由程序完成的,而内存的释放就是有垃圾收集器(GC)完成的,程序员不需要通过调用GC函数来释放内存,因为GC是由JVM决定什么时候执行的,有的是内存使用到一定程度时,有的是定时,有的是中断式执行GC。但GC只能回收无用并且不再被其他对象引用的那些对象所占用的空间。
Java的内存垃圾回收机制是从程序的主要运行对象开始检查引用链,当遍历一遍后发现没有被引用的孤立对象就作为垃圾回收。




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


内存溢出的解决:
1、修改JVM启动参数,直接增加内存。JVM默认的可以使用的内存为64M,Tomcat默认可以使用的内存为128M,对于稍微复杂一点的系统就会不够用,就会报出“OutOfMemory”错误,因此,-Xms,-Xmx参数一定不要忘记;
2、检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。查看日志对于分析内存溢出是十分重要的,通过仔细检查日志,分析内存溢出前做过哪些操作,可以大致定位有问题的模块;
3、对代码进行走查和分析,找出可能发生内存溢出的位置,重点排查:
①、检查代码块是否有死循环或递归调用;

②、检查是否有大循环重复产生新对象实体;
③、检查对数据库查询中,是否有一次获得全部数据的查询(对数据库查询尽量采用分页的方式);
④、检查List、Map等集合对象是否有使用完后未清除的问题(List、Map等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收);

4、使用内存工具查看工具动态查看内存使用情况(内存查看工具有:Oprimizeit Profiler,JProbe Profiler,JinSight和Java1.5的Jconsole等);

总结:总的来说,内存溢出产生的原因就是由于代码写的不好,提高对代码的质量要求是根本解决内存溢出的方法!!!