java.lang.OutOfMemoryError: Java heap space 根源在哪里?

songminghong 2011-10-03 04:09:24
我循环了很多次hibernate的save方法往数据库里插入数据,总会出现如下错误:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.microsoft.sqlserver.jdbc.TDSPacket.<init>(IOBuffer.java:3121)
at com.microsoft.sqlserver.jdbc.TDSReader.readPacket(IOBuffer.java:3290)
at com.microsoft.sqlserver.jdbc.TDSCommand.startResponse(IOBuffer.java:4360)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:369)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:322)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4003)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1550)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:160)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:133)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(SQLServerPreparedStatement.java:290)
at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2176)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2656)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:563)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:551)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:547)
at com.dao.StandardinfoDAO.save(StandardinfoDAO.java:64)
at com.treat.StandInfo.<init>(StandInfo.java:135)
at com.treat.StartLog.main(StartLog.java:21)
...全文
464 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
FCBryant 2011-10-09
  • 打赏
  • 举报
回复
fuwenhai,大侠~~。
我刚好也碰到一个OutOfMemoryError的问题,

java.lang.OutOfMemoryError: unable to create new native thread

这种是不是程序存在句柄泄漏?
多谢。

ps:万恶的搜索怎么找不出来!!!
luyun2011 2011-10-09
  • 打赏
  • 举报
回复
java.lang.OutOfMemoryError异常处理总结
原因:
常见的有以下几种:

1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;

2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;

3.代码中存在死循环或循环产生过多重复的对象实体;

4.使用的第三方软件中的BUG;

5.启动参数内存值设定的过小;

常见错误提示:
1.tomcat:java.lang.OutOfMemoryError: PermGen space

2.tomcat:java.lang.OutOfMemoryError: Java heap space

3.weblogic:Root cause of ServletException java.lang.OutOfMemoryError

4.resin:java.lang.OutOfMemoryError

5.java:java.lang.OutOfMemoryError

解决;
1.应用服务器提示错误的解决:
把启动参数内存值设置足够大。详细请看下列文章:
tomcat:
http://ajava.org/exep/tomcat/14010.html
http://ajava.org/exep/tomcat/14011.html

weblogic:
http://ajava.org/exep/weblogicyichang/14013.html

resin:
http://ajava.org/exep/resin/14014.html

Jboss:
http://ajava.org/exep/jboss/14012.html

2.Java代码导致错误的解决:
重点排查以下几点:

1)检查代码中是否有死循环或递归调用。

2)检查是否有大循环重复产生新对象实体。

3)检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。

4 )检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收

网友案例:
1.hibernate查询数据时,一次查询过多的数据,后来调整了该部分的代码,每次只取出指定量的数据,成功的解决该问题。
2.在做压力测试时,出现OutOfMemoryError,发现session的资源一直没有被释放产生的,最好通过session的invalidate()方法将session的资源释放。
3.程序中出现死循环。
4.tomcat部署、运行出现OutOfMemoryError,加大内存参数值,解决此问题。
老紫竹 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 bao110908 的回复:]

这有啥根源?

你只有一个小碗,硬是要把一大碗水往里面倒!
[/Quote]

不是一大碗,是一大堆的小碗,只管倒,不往外舀!
gloomyfish 2011-10-09
  • 打赏
  • 举报
回复
显然是你的Hibernate操作导致了JVM memory leaking的问题
你用个Java Profiling的工具一看便知!

我非常确信!
weiniyang 2011-10-08
  • 打赏
  • 举报
回复
学习了!
jumpheightway 2011-10-05
  • 打赏
  • 举报
回复
内存中对象太多,要手动收集垃圾处理,或者尽可能不要创建那么多对象
  • 打赏
  • 举报
回复
这有啥根源?

你只有一个小碗,硬是要把一大碗水往里面倒!
im110 2011-10-05
  • 打赏
  • 举报
回复
Java heap space 是虚拟机创建了太多对象造成的。
你用数据库连接池,设定最大的连接数,应该就可以避免这个问题了。
tongxinjava 2011-10-04
  • 打赏
  • 举报
回复
学习了,看看
songminghong 2011-10-04
  • 打赏
  • 举报
回复
问题搞定,显式调用close方法就ok了,这是多么弱智的问题。hibernate没有自动关闭连接么?
铁匠梁 2011-10-04
  • 打赏
  • 举报
回复
这点日志说明:连接数据库时申请内存时发现内存已使用完,于是乎就爆出了内存溢出。需要把内存的dump文件导出,然后使用工具分析看看是那个业务逻辑有内存泄漏问题。
songminghong 2011-10-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhouyuqwert 的回复:]
增加内存不能解决根本 你找下是不是什么资源没释放什么的
[/Quote]
如何找?有没有什么方法?
songminghong 2011-10-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dinglimin2009 的回复:]
关于这个问题,首先楼主,你应该加大你服务器的内存(比如Tomcat),然后再看看你服务器中JVM关于内存的设置,JVM的的内存分为永久储存区(常用的api的class)和堆空间,堆空间分为新生区和养老去,新生区分为伊迪园区和幸存者一区以及幸存者二区,一般我们new出来的都会在伊迪园区中产生,随着伊迪园区的内存的使用,会将一些new出来的变量放到幸存者一区(过程中的算法,多数采用根集法衍生出来的算法……
[/Quote]
我想应该是程序写的有问题,可是我没有new很多对象啊,都是在while循环里new的。
xiaoniu528 2011-10-03
  • 打赏
  • 举报
回复
支持5#的
dinglimin2009 2011-10-03
  • 打赏
  • 举报
回复
关于这个问题,首先楼主,你应该加大你服务器的内存(比如Tomcat),然后再看看你服务器中JVM关于内存的设置,JVM的的内存分为永久储存区(常用的api的class)和堆空间,堆空间分为新生区和养老去,新生区分为伊迪园区和幸存者一区以及幸存者二区,一般我们new出来的都会在伊迪园区中产生,随着伊迪园区的内存的使用,会将一些new出来的变量放到幸存者一区(过程中的算法,多数采用根集法衍生出来的算法),以此类推到幸存者二区,等到这个三个区满了以后,就会报内存溢出。这样的话 楼主可以去看看自己的JVM的设置,当然 这这是从JVM的角度来分析 如果从程序自身来看 楼主也可以去分析一下
阳明 to life 2011-10-03
  • 打赏
  • 举报
回复
增加内存不能解决根本 你找下是不是什么资源没释放什么的
songminghong 2011-10-03
  • 打赏
  • 举报
回复
no 肯定不是,我是用java读取txt文件,然后插入到数据库中的,就没有用到jsp
horse201 2011-10-03
  • 打赏
  • 举报
回复
JSP文件太大了?
songminghong 2011-10-03
  • 打赏
  • 举报
回复
网上说设置-Xms500m -Xmx1024m,我试过了,只是程序运行的时间更长了,不过还是会出现如上的错误,我想知道根源在哪里。
请教各位大虾,先谢谢了

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧