如题,
在写Java程序时,如果读入的数据“过多”,
则会运行失败,
提示“OutOfMemory Error”。目前,我是精简了部分数据结构和处理流程,
暂时没有这个错误了。但如果以后数据量大了的话,还是有可能再出现这个问题吧?
所以,请教各位,
如何才能避免“OutOfMemory Error”这个错误呢?
大家有什么经验吗?
或者,这是由于我程序的原因吗?

解决方案 »

  1.   

    增大JVM虚拟内存,具体方法请google,在此不赘述了
      

  2.   

    使用像 java -Xmx512m ...
      

  3.   

    这个方法不能从根本上解决问题jvm最多只能找到2G,在仔看看代码看看那里逻辑上肯能有问题。
    本人建了个技术交流群95369264欢迎大家加入
      

  4.   

    先做做内存监控,比如用jprobe(好像收费的);%JAVA_HOME%\demo\management\MemoryMonitor稍微改良下也可以用。看看是否有内存泄露。
    另外,应该避免大量读取数据,不用的数据先不要取到内存,必须用的时候再去取。
    还有,适当增大xmx和xms值。
      

  5.   

    发生OutOfMemoryError主要三个可能:1.JVM发生堆管理系统内部实现的bug引起的内存泄漏,这个可能性太低
    2.应用程序的工作可用内存不够
      i. 增加JVM堆内存(-Xmx -XX:PermSize -XX:MaxPermSize)
      ii.减少应用程序需要的内存(是不是某些Collection太大了,运用了过多大的buffer)
    3.或者是一些无心的对象保留侵占了内存,本应该除去,多检查再试试gc等等
      

  6.   

    修:以上Perm Space应该不是堆的 -XX:PermSize and -XX:MaxPermSize
      

  7.   

    1、如果是读文本的话,大文本文件如果对效率不是特别要求,建议边读边操作
    2、如果是操作数据库,直接执行/操作数据库语句。例如,进行一系列复杂的操作,先从多个表联合找出数据,然后再将数据插入到某个表这样的操作时,直接用SQL一步完成,不要将中间结果select出来存在RS中
      

  8.   

    目前的操作基本上还是需要将数据全部读入内存,
    用于建立内存索引等。数据量应该不会超过1G。所以,是不是调整一下JVM的虚存容量好些?
      

  9.   

    一般的程序是不会出现OutifMemory的error的
    出现这样的问题,我个人认为好好的检查下自己代码那些内存块没有释放,
    还有就是文件读写的时候,用分块的方法,比如说一次读多少K一次写多少K这样控制比较好,而且效率也应该比较满意