`

java内存溢出问题(java.lang.OutOfMemoryError)

    博客分类:
  • java
阅读更多
内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存。内存溢出主要是从容器和程序类两个方面进行排查,容器问题可以调整容器参数来解决。此类问题大多是因为程序引起的,要从根本上解决这类问题需要重点放在程序代码的编写上。

所以在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块中进行注销,保证在异常情况下也会注销,否则一直都会驻在内存。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics