2017-10-28 197 views
0

了很多努力,我似乎​​无法克服得到一个避免“GC开销超限”错误

GC开销限制的问题后,在我的Java程序超过

错误。

它的发生是含有大量字符串操作,对象名单,数量和访问DB一个大方法中。 我曾尝试以下:

    使用每个的ArrayList后
  1. ,我已经加入:列表=新的ArrayList <>();列表= NULL;
  2. 对于琴弦,而不是具有例如。 50次追加(STR + =“....”)我尝试有一个附加每个DB访问我关闭语句和结果集后总文本

此方法是从主叫这样的:

for(int i=0; i<L; i++) { 
    cns = new Console(i); 

    cns.processData();//this is the method 

    cns=null; 
} 

当此循环被执行1次或2次,一切正常。对于L> = 3,我几乎肯定会得到垃圾回收器错误。

不应该在每次执行该方法后都有一个cns = null的事实,强制执行GC并将所有内容从前一次执行中解放出来?

是否也应该将其设置为null之前删除对象的所有私有属性?也许把一个Thread.sleep()可以在每个循环后强制GC?

+0

也许你第三次运行占用太多的内存。我会建议将你的大方法分成更小的方法。手动调用GC和Thread.spleep是一种错误的方法。 – Admit

回答

0

其实没有理由在每个循环的结束设定cns为null。无论如何,你在循环开始时将它设置为new Console() - 如果通过将其设置为空来释放任何东西,则也将通过将其设置为新对象来释放它。

你可以尝试一个System.gc();调用来建议系统做一个垃圾回收,但我不知道这是否会帮助你或使之变得更糟。系统已经在尝试垃圾收集 - 如果没有,你不会得到这个错误。

你不告诉我们你究竟是如何建立你的字符串,但请记住,+=不是唯一的罪魁祸首。如果你有类似String s = "Hello " + "to the" + " world";的东西,那就像把它放在三条线上并使用+=一样糟糕。如果这是个问题,StringBuilder可能是你的朋友。

您可以阅读Error java.lang.OutOfMemoryError: GC overhead limit exceeded的答案就如何避免这种错误的一些其他建议。看起来对于一些人来说,当你几乎但不是完全没有记忆的时候,它就会被触发。所以增加可用于Java的内存量可能会(或不会)有所帮助。

+0

感谢您的回答。 StringBuilder技巧帮助了我。另外,在数据库方面。除了在每条语句之后关闭语句和ResultSet之外,是否偶尔关闭Connection也是一种好习惯?这会节省内存吗? – hragber

+0

它可能会节省少量的内存,但除非在数据库调用之间进行重要的处理或等待用户输入,否则可能不值得。如果你不断关闭连接并创建新连接,那只会意味着更多的垃圾收集。 –

相关问题