本帖最后由 matrix1984 于 2013-09-16 10:42:18 编辑

解决方案 »

  1.   

    机器的话楼主你看下 eclipse 配置,应该是eclipse配置有问题。
    对于程序的话要进行优化
    记得以前看《effective java》时,里面说过,有些程序你明明在自己电脑上运行得好好的,等到发布程序给用户时候,各种各样的错误都出现了。
      

  2.   

    内存管理是Java程序员的弱项。
    首先,你机器有100多G内存,并不代表你的JVM都能用,这里对于JVM的调试要下一点功夫。
    其次,1楼说你读文件太快,数据库来不及写入然后释放内存,这是你程序设计的缺陷。从来没有听说过程序员抱怨机器性能太好导致程序运行不了的(历史上也有这样的案例,如早期的某些游戏,最著名的就是红色警戒95,机器性能好的时候,你的游戏会在一秒钟之内结束,它没有内部时钟,全靠CPU时钟当做速度标准,CPU一快,它就尴尬了)。这时候你要做的就是限制文件读取缓冲区大小,满了就不读,处理完了才继续读
      

  3.   


    我有一点忘记说了:改程序分两部分,1)读取文件数据,并先保存至数据库;2)读取数据库,进行处理(这里只涉及到数据库操作)。其实,多线程只发生在2)里头,所以跟文件读取无关。此外,2)当中是每读取5000数据放入一个线程进行处理,其间有批量保存数据(<=5000)的动作,OutOfMemory就是发生在这里。
      

  4.   

    算你一条数据200个字段,每个字段8个字节,外加一个10000字节的文本,5000条也只有(200 * 8 + 10000) * 5000 = 58MB,3个线程撑死不到200MB内存。查看你的JVM启动内存吧
      

  5.   


    我有一点忘记说了:改程序分两部分,1)读取文件数据,并先保存至数据库;2)读取数据库,进行处理(这里只涉及到数据库操作)。其实,多线程只发生在2)里头,所以跟文件读取无关。此外,2)当中是每读取5000数据放入一个线程进行处理,其间有批量保存数据(<=5000)的动作,OutOfMemory就是发生在这里。
    应该是你查询数据库,得到的数据量超过你启动内存大小了。tomcat可以在catalina.sh中修改启动内存大小(默认好像是80M),其它容器的配置就不清楚了。
      

  6.   


    可能是正解
    楼上c++大牛 也到java版里来混分数 您老高抬贵手 留点分数给我们这些小菜吧
      

  7.   

    机器性能好导致内存溢出?开什么玩笑,啥关系没有.
    你机器性能不好也不一定会溢出.
    内存溢出就查一下jvm分配的内存是不是小了.另外跟踪一下单位时间插入数据库的数据量.
      

  8.   

    调JVM内存不是解决办法,还是优化代码吧,
      

  9.   

    检查代码漏洞;调大JVM的-Xmx和Xms,让JVM有更多的可用内存空间。
      

  10.   

    读取的数据大小超过了jvm内存限制,跟机器什么关系。
      

  11.   

    内存不足有两种可能, jvm内存不足(此时可以尝试用楼上方法),本机内存不足(考虑是否是文件流操作有问题)
      

  12.   

    OutOfMemoryError 产生的原因是因为你在内存中加载了大量的数据,估计是你把文件全部读到了一个类似于 List 或者其他什么的数据结构中了,如果文件行数过大,最终只有这样一个结果!你得读取一些数据操作完成后再去读取第二批数据,这样可以把内存占用控制在一个合理的范围之内,而且几乎不可能会出现 OutOfMemoryError 的错误!这么大的内存对于这样的程序而言就是大材小用,应该从应用程序本身进行优化,而不是单纯地依赖于增加服务器的硬件配置。
      

  13.   


    可能是正解
    楼上c++大牛 也到java版里来混分数 您老高抬贵手 留点分数给我们这些小菜吧排名92、、、、
      

  14.   

    问题的关键是:楼主的程序,没有控制内存的使用。
    解决方案,
    一般会设置JVM的最大内存占用值,但是,也会存在内存溢出的风险。
    最好是能够优化程序代码,比如,重复使用缓冲区,数组等,尽量减少各种对象的创建操作。
    还有,集合对象,使用完毕后,要调用clear方法等。
      

  15.   

    实际上问题很简单,部署的那个家伙没改JVM的-Xmx和Xms,被他气死!尽然来了很多大牛,开心啊~散分~