加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

垃圾收集过载,Java

发布时间:2020-12-15 08:43:16 所属栏目:Java 来源:网络整理
导读:问题是,由于垃圾收集时间的原因,我在性能方面有一些权衡.这个问题可以概括为: public void loop(BlockingQueueRunnable queue) { int j = queue.size(); for(int i =0; ij;i++)//line2 { Runnable runnable = queue.take(); runnable.run();//line4 if(Math
问题是,由于垃圾收集时间的原因,我在性能方面有一些权衡.这个问题可以概括为:

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个元素.
并且因为我在循环中迭代队列,即使已经“运行”的对象超出范围,它们仍然不可用于垃圾收集,因为它们在invisible state.因此,如果我没有第5行,那么当方法离开堆栈时,垃圾收集器突然会有巨大的负载.想象一下,如果同时有很多线程访问menthod.

我的问题:

>需要第5行吗?还有其他替代品吗?
>如果我必须使用第5行,我发现与没有第5行相比,性能非常糟糕.

最终垃圾收集必须发生?我无法弄清楚什么时候应该发生.

PS:我的电脑上禁用了Javascript,因此无法评论答案.我将在这里编辑帖子以征求意见:

@amit:我已经改变了代码,我想你已经理解了问题的本质.代码只是一个示例.

@Tobi:谢谢,但是如何设置更大的堆大小,解决问题.这只会延迟gc的时间.
所以你认为没有手动gc它会表现最好吗?
从http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html开始,它表示只有一次采用堆栈的方法,只有在这种情况下它才可用于垃圾收集.我尝试使用finalize()(通过打印,而不是正确的方式,但至少应该为100000个对象工作一次),绝对没有gc.

@Paolo:谢谢.我想要实现的是一个流水线模型,其中每个线程都有一个meassage队列,基本上是一个框架,任何线程都可以将runnable发布到另一个线程(如果它对线程有一些工作),另一个线程将执行在soem时间之后(当它空闲时)
Ans当我的意思是,当方法从堆栈中出来时重载,我的意思是垃圾收集最终会发生,如果它发生在以后,那么清除40,000个元素将花费很多时间

@Joachim Sauer:System.gc可以收集不可见的对象,只是垃圾收集器不会自动收集它们.但是当被迫时,它按照:http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html进行

解决方法

1) Is line 5 needed? Is there any other substitute?

不需要调用System.gc().事实上,调用System.gc()对吞吐量有害.

只需删除第5行即可.无需替换任何内容.

2) If I have to have line 5,I found out the performance was very very bad when compared to not having it.

这完全像我期望的那样.往上看.

And because I am iterating over the queue in a loop,even though the already ‘run’ objects are out of scope,they are still not available for garbage Collection because they are in invisible state

事实上:

>在一个超出范围的可运行变量引用的“不可见”状态中最多只能有一个对象,和
>强制垃圾收集无论如何都不会收回它.

System.gc can collect invisible objects.

这句话是错误的.事实上,不可见对象的问题是GC无法收集它们.实际上,您链接的文章非常清楚地说明了这一点:

Because invisible objects can’t be collected,this is a possible cause of memory leaks. If you run into this situation,you might have to explicitly null your references to enable garbage collection.”

(重点补充.)

坦率地说,我认为你正试图解决一个不存在的问题.或者如果确实存在,则与隐形对象无关.

如果隐形对象确实存在问题,那么解决方案就是在循环结束时简单地为变量赋值null.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读