我循环了很多次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)

解决方案 »

  1.   

    网上说设置-Xms500m -Xmx1024m,我试过了,只是程序运行的时间更长了,不过还是会出现如上的错误,我想知道根源在哪里。
    请教各位大虾,先谢谢了
      

  2.   

    no 肯定不是,我是用java读取txt文件,然后插入到数据库中的,就没有用到jsp
      

  3.   

    关于这个问题,首先楼主,你应该加大你服务器的内存(比如Tomcat),然后再看看你服务器中JVM关于内存的设置,JVM的的内存分为永久储存区(常用的api的class)和堆空间,堆空间分为新生区和养老去,新生区分为伊迪园区和幸存者一区以及幸存者二区,一般我们new出来的都会在伊迪园区中产生,随着伊迪园区的内存的使用,会将一些new出来的变量放到幸存者一区(过程中的算法,多数采用根集法衍生出来的算法),以此类推到幸存者二区,等到这个三个区满了以后,就会报内存溢出。这样的话 楼主可以去看看自己的JVM的设置,当然 这这是从JVM的角度来分析 如果从程序自身来看 楼主也可以去分析一下
      

  4.   

    我想应该是程序写的有问题,可是我没有new很多对象啊,都是在while循环里new的。
      

  5.   

    这点日志说明:连接数据库时申请内存时发现内存已使用完,于是乎就爆出了内存溢出。需要把内存的dump文件导出,然后使用工具分析看看是那个业务逻辑有内存泄漏问题。
      

  6.   

    问题搞定,显式调用close方法就ok了,这是多么弱智的问题。hibernate没有自动关闭连接么?
      

  7.   

    Java heap space 是虚拟机创建了太多对象造成的。
    你用数据库连接池,设定最大的连接数,应该就可以避免这个问题了。
      

  8.   

                           java.lang.OutOfMemoryError异常处理总结
    原因:
    常见的有以下几种:1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;3.代码中存在死循环或循环产生过多重复的对象实体;4.使用的第三方软件中的BUG;5.启动参数内存值设定的过小;常见错误提示:
    1.tomcat:java.lang.OutOfMemoryError: PermGen space 2.tomcat:java.lang.OutOfMemoryError: Java heap space3.weblogic:Root cause of ServletException java.lang.OutOfMemoryError4.resin:java.lang.OutOfMemoryError5.java:java.lang.OutOfMemoryError解决;
    1.应用服务器提示错误的解决:
    把启动参数内存值设置足够大。详细请看下列文章:
    tomcat:
    http://ajava.org/exep/tomcat/14010.html
    http://ajava.org/exep/tomcat/14011.htmlweblogic:
    http://ajava.org/exep/weblogicyichang/14013.htmlresin:
    http://ajava.org/exep/resin/14014.htmlJboss:
    http://ajava.org/exep/jboss/14012.html2.Java代码导致错误的解决:
    重点排查以下几点:1)检查代码中是否有死循环或递归调用。2)检查是否有大循环重复产生新对象实体。3)检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。4 )检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收网友案例:
    1.hibernate查询数据时,一次查询过多的数据,后来调整了该部分的代码,每次只取出指定量的数据,成功的解决该问题。
    2.在做压力测试时,出现OutOfMemoryError,发现session的资源一直没有被释放产生的,最好通过session的invalidate()方法将session的资源释放。
    3.程序中出现死循环。
    4.tomcat部署、运行出现OutOfMemoryError,加大内存参数值,解决此问题。
      

  9.   

    fuwenhai,大侠~~。
    我刚好也碰到一个OutOfMemoryError的问题,java.lang.OutOfMemoryError: unable to create new native thread这种是不是程序存在句柄泄漏?
    多谢。ps:万恶的搜索怎么找不出来!!!
      

  10.   

    显然是你的Hibernate操作导致了JVM memory leaking的问题
    你用个Java Profiling的工具一看便知!我非常确信!