内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存。内存溢出主要是从容器和程序类两个方面进行排查,容器问题可以调整容器参数来解决。此类问题大多是因为程序引起的,要从根本上解决这类问题需要重点放在程序代码的编写上。
所以在Java中一般报内存溢出的除去容器参数原因有以下几种:
1、查询数据库的时候递归循环了,应尽量使用精简的关联SQL查询。内存中加载的数据量过于庞大,如一次从数据库取出过多数据而没有采用分页读取。
2、异常时没有加finally{}来释放某些资源,直接使用JDBC是很普遍的事情。或者数据库链接没有采用统一缓冲池的模式。
3、算法上的问题,不应该把大的数据,比如文件和Blob/Clob之类的东西读入到内存进行处理,而应该用Stream的方式进行。
4、 把某个对象放到了一个Set/List/Map 里面,用完了没有尽快释放。
5、 尽量少用静态变量,因为静态变量是全局的。
6、 把某些集合放到了 Session/Application 里面了,这样,如果Session不过期,他们占用内存就不会释放,即使其他地方为null也没用,既是说应用中存在大量的没有释放的Session或application。
7、程序里不可避免大量使用字符串处理,避免使用String,应大量使用StringBuffer,每一个String对象都得独立占用内存一块区域;String str = "aaa"; String str2 = "bbb"; String str3 = str + str2;//假如执行此次之后str ,str2以后再不被调用,那它就会被放在内存中等待Java的GC去回收,程序内过多的出现这样的情况就会报上面的那个错误,建议在使用字符串时能使用StringBuffer而不要使用String,这样可以省不少开销;
8、 不要在经常调用的方法中创建对象,尤其是忌讳在循环中创建对象。可以适当的使用hashtable,vector 创建一组对象容器,然后从容器中去取那些对象,而不用每次new之后又丢弃。对集合类使用添加后,需要移除元素的时需要使用提供的对应remove方法例如集合中的HashMap时候删除元素一定要使用提供的remove()方法。当然若作为局部变量使用,如在方法内使用,没有问题,方法作用域结束可以回收,但是若是全局的比如static变量时,当map中无用的某个元素obj被其他引用指向的时候,可能不一定能被回收,导致内存泄露。
9、监听器类型的资源注册后没有注销,而且要保证在finally块中进行注销,保证在异常情况下也会注销,否则一直都会驻在内存。
分享到:
相关推荐
java 内存溢出分析工具 CoreAnalyzer
java 内存溢出分析工具 HeapAnalyzer
websphere 内存溢出 javacore分析工具jca456 分析javacore的好工具 分析javacore的好工具
总结了点HeapAnalyzer456.jar 分析内存溢出的攻略。 新手可以看看
websphere 内存溢出 javacore分析工具jca401 分析javacore的好工具 分析javacore的好工具
java IBM websphere 内存溢出 javacore deapdump CPU内存分析工具
对于内存溢出,首先想到...既然分析内存溢出,那从这几种内存逐一分析。 1,程序计数器:是一个较小的内存空间,是但钱线程的字节码行号指示器,这个不会出现内存溢出。 2,虚拟即栈:虚拟即栈抛出的异常叫做Sta
下面我们通过一段代码来模拟一下此种情况的内存溢出。 import java.util.*; import java.lang.*; public class OOMTest{ public void stackOverFlowMethod(){ stackOverFlowMetho
Java的内存管理机制分析 让你了解java的内存管理 以及如何去分析它
主要介绍了Java内存溢出案例模拟和原理分析过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了Java 堆内存溢出原因分析,任何使用过基于 Java 的企业级后端应用的软件开发者都会遇到过这种报错,java.lang.OutOfMemoryError:Java heap space。,需要的朋友可以参考下
该工具用来排查线上程序出现内存泄漏或溢出,死锁等相关问题,快速分析堆栈异常情况,找到问题代码进行修复。
本篇文章主要分析了JAVA程序内存溢出问题原因,较为详细的说明了java导致程序内存溢出的原因与解决方法,感兴趣的小伙伴们可以参考一下。
在开发项目过程中,需要处理算法分析出来二进制流数据,并对数据解析处理转发。我们上层应用平台是使用java开发的,但开放平台是使用c++开发,虽提供给我们对应的.h头文件,但在java中来解析这些数据就显然有些复杂...
Java内存分析工具MAT(Memory Analyzer Tool) 可以解析内存的消耗,定位具体的类,定位问题
用于分析Java内存溢出,或者内存泄露,需要配合jmap dump出内存文件
本人原创文章,分要的多点. 内存溢出与数据库锁表的问题,可以说是开发人员的噩梦,一般的程序...本文以笔者开发和支持的多个项目为例,与大家分享在开发过程中遇到的Java内存溢出和数据库锁表的检测和处理解决过程。
简单的判断JVM内存溢出的方法
本作者项目原创经历,内容关于java的一个web项目内存溢出的分析和解决,其中详细介绍了诊断的方法和一些工具的使用,重点写了利用Eclipse Memory Analyzer 分析工具来分析jvm的堆快照。很有实用价值。
生产系统内存溢出的分析,包含工具的使用