垃圾收集过载,Java
问题是,由于垃圾收集时间的原因,我在性能方面有一些权衡.这个问题可以概括为:
public void loop(BlockingQueue<Runnable> queue) { int j = queue.size(); for(int i =0; i<j;i++)//line2 { Runnable runnable = queue.take(); runnable.run();//line4 if(Math.random() > 0.9) System.gc();//line5 } //line7 //will 'runnable = null;' answer the question,logically it looks right } 现在,通常作为参数传递的队列通常包含超过40,000个元素. 我的问题: >需要第5行吗?还有其他替代品吗? 最终垃圾收集必须发生?我无法弄清楚什么时候应该发生. PS:我的电脑上禁用了Javascript,因此无法评论答案.我将在这里编辑帖子以征求意见: @amit:我已经改变了代码,我想你已经理解了问题的本质.代码只是一个示例. @Tobi:谢谢,但是如何设置更大的堆大小,解决问题.这只会延迟gc的时间. @Paolo:谢谢.我想要实现的是一个流水线模型,其中每个线程都有一个meassage队列,基本上是一个框架,任何线程都可以将runnable发布到另一个线程(如果它对线程有一些工作),另一个线程将执行在soem时间之后(当它空闲时) @Joachim Sauer:System.gc可以收集不可见的对象,只是垃圾收集器不会自动收集它们.但是当被迫时,它按照:http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html进行 解决方法
不需要调用System.gc().事实上,调用System.gc()对吞吐量有害. 只需删除第5行即可.无需替换任何内容.
这完全像我期望的那样.往上看.
事实上: >在一个超出范围的可运行变量引用的“不可见”状态中最多只能有一个对象,和
这句话是错误的.事实上,不可见对象的问题是GC无法收集它们.实际上,您链接的文章非常清楚地说明了这一点:
(重点补充.) 坦率地说,我认为你正试图解决一个不存在的问题.或者如果确实存在,则与隐形对象无关. 如果隐形对象确实存在问题,那么解决方案就是在循环结束时简单地为变量赋值null. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |