多线程下,机器性能太好,导致内存溢出?? 本帖最后由 matrix1984 于 2013-09-16 10:42:18 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 机器的话楼主你看下 eclipse 配置,应该是eclipse配置有问题。对于程序的话要进行优化记得以前看《effective java》时,里面说过,有些程序你明明在自己电脑上运行得好好的,等到发布程序给用户时候,各种各样的错误都出现了。 内存管理是Java程序员的弱项。首先,你机器有100多G内存,并不代表你的JVM都能用,这里对于JVM的调试要下一点功夫。其次,1楼说你读文件太快,数据库来不及写入然后释放内存,这是你程序设计的缺陷。从来没有听说过程序员抱怨机器性能太好导致程序运行不了的(历史上也有这样的案例,如早期的某些游戏,最著名的就是红色警戒95,机器性能好的时候,你的游戏会在一秒钟之内结束,它没有内部时钟,全靠CPU时钟当做速度标准,CPU一快,它就尴尬了)。这时候你要做的就是限制文件读取缓冲区大小,满了就不读,处理完了才继续读 我有一点忘记说了:改程序分两部分,1)读取文件数据,并先保存至数据库;2)读取数据库,进行处理(这里只涉及到数据库操作)。其实,多线程只发生在2)里头,所以跟文件读取无关。此外,2)当中是每读取5000数据放入一个线程进行处理,其间有批量保存数据(<=5000)的动作,OutOfMemory就是发生在这里。 算你一条数据200个字段,每个字段8个字节,外加一个10000字节的文本,5000条也只有(200 * 8 + 10000) * 5000 = 58MB,3个线程撑死不到200MB内存。查看你的JVM启动内存吧 我有一点忘记说了:改程序分两部分,1)读取文件数据,并先保存至数据库;2)读取数据库,进行处理(这里只涉及到数据库操作)。其实,多线程只发生在2)里头,所以跟文件读取无关。此外,2)当中是每读取5000数据放入一个线程进行处理,其间有批量保存数据(<=5000)的动作,OutOfMemory就是发生在这里。应该是你查询数据库,得到的数据量超过你启动内存大小了。tomcat可以在catalina.sh中修改启动内存大小(默认好像是80M),其它容器的配置就不清楚了。 可能是正解楼上c++大牛 也到java版里来混分数 您老高抬贵手 留点分数给我们这些小菜吧 机器性能好导致内存溢出?开什么玩笑,啥关系没有.你机器性能不好也不一定会溢出.内存溢出就查一下jvm分配的内存是不是小了.另外跟踪一下单位时间插入数据库的数据量. 调JVM内存不是解决办法,还是优化代码吧, 检查代码漏洞;调大JVM的-Xmx和Xms,让JVM有更多的可用内存空间。 读取的数据大小超过了jvm内存限制,跟机器什么关系。 内存不足有两种可能, jvm内存不足(此时可以尝试用楼上方法),本机内存不足(考虑是否是文件流操作有问题) OutOfMemoryError 产生的原因是因为你在内存中加载了大量的数据,估计是你把文件全部读到了一个类似于 List 或者其他什么的数据结构中了,如果文件行数过大,最终只有这样一个结果!你得读取一些数据操作完成后再去读取第二批数据,这样可以把内存占用控制在一个合理的范围之内,而且几乎不可能会出现 OutOfMemoryError 的错误!这么大的内存对于这样的程序而言就是大材小用,应该从应用程序本身进行优化,而不是单纯地依赖于增加服务器的硬件配置。 可能是正解楼上c++大牛 也到java版里来混分数 您老高抬贵手 留点分数给我们这些小菜吧排名92、、、、 问题的关键是:楼主的程序,没有控制内存的使用。解决方案,一般会设置JVM的最大内存占用值,但是,也会存在内存溢出的风险。最好是能够优化程序代码,比如,重复使用缓冲区,数组等,尽量减少各种对象的创建操作。还有,集合对象,使用完毕后,要调用clear方法等。 实际上问题很简单,部署的那个家伙没改JVM的-Xmx和Xms,被他气死!尽然来了很多大牛,开心啊~散分~ JExcel API 问题 有没有用JAVA做的好看点的界面呢? 怎么把字符串分隔符分出的4位数字区分出来(分隔符有多种)? 请问各位高手怎样使JTextField获得焦点? ByteArrayInputStream 如何转化成 String 我急盼着你的回音 Hashtable问题 请问哪里有JAVA的帮助文档下载(140多兆的那个) 集合遍历问题 创建一个service层实例总是出下面错误,求解 最近总是不想看书 关于字符串操作中intern()方法的调用问题
对于程序的话要进行优化
记得以前看《effective java》时,里面说过,有些程序你明明在自己电脑上运行得好好的,等到发布程序给用户时候,各种各样的错误都出现了。
首先,你机器有100多G内存,并不代表你的JVM都能用,这里对于JVM的调试要下一点功夫。
其次,1楼说你读文件太快,数据库来不及写入然后释放内存,这是你程序设计的缺陷。从来没有听说过程序员抱怨机器性能太好导致程序运行不了的(历史上也有这样的案例,如早期的某些游戏,最著名的就是红色警戒95,机器性能好的时候,你的游戏会在一秒钟之内结束,它没有内部时钟,全靠CPU时钟当做速度标准,CPU一快,它就尴尬了)。这时候你要做的就是限制文件读取缓冲区大小,满了就不读,处理完了才继续读
我有一点忘记说了:改程序分两部分,1)读取文件数据,并先保存至数据库;2)读取数据库,进行处理(这里只涉及到数据库操作)。其实,多线程只发生在2)里头,所以跟文件读取无关。此外,2)当中是每读取5000数据放入一个线程进行处理,其间有批量保存数据(<=5000)的动作,OutOfMemory就是发生在这里。
我有一点忘记说了:改程序分两部分,1)读取文件数据,并先保存至数据库;2)读取数据库,进行处理(这里只涉及到数据库操作)。其实,多线程只发生在2)里头,所以跟文件读取无关。此外,2)当中是每读取5000数据放入一个线程进行处理,其间有批量保存数据(<=5000)的动作,OutOfMemory就是发生在这里。
应该是你查询数据库,得到的数据量超过你启动内存大小了。tomcat可以在catalina.sh中修改启动内存大小(默认好像是80M),其它容器的配置就不清楚了。
可能是正解
楼上c++大牛 也到java版里来混分数 您老高抬贵手 留点分数给我们这些小菜吧
你机器性能不好也不一定会溢出.
内存溢出就查一下jvm分配的内存是不是小了.另外跟踪一下单位时间插入数据库的数据量.
可能是正解
楼上c++大牛 也到java版里来混分数 您老高抬贵手 留点分数给我们这些小菜吧排名92、、、、
解决方案,
一般会设置JVM的最大内存占用值,但是,也会存在内存溢出的风险。
最好是能够优化程序代码,比如,重复使用缓冲区,数组等,尽量减少各种对象的创建操作。
还有,集合对象,使用完毕后,要调用clear方法等。