JAVA中的垃圾收集(标记和扫描和引用计数)

时间:2014-04-24 12:12:18

标签: java collections garbage-collection rmi distributed

在分布式系统中工作时,我对Java的垃圾收集概念有一些疑问:

  1. 为什么在RMI系统中不推荐使用mark-and-sweep GC?

  2. 是否可以在并行线程中运行GC“引用计数”算法而不挂起应用程序本身?

  3. 提前致谢。

3 个答案:

答案 0 :(得分:2)

  

为什么在RMI系统中不推荐使用mark-and-sweep GC?

我不相信它。

  

是否可以在不挂起应用程序本身的情况下在并行线程中运行GC"引用计数" -algorithm?

虽然引用计数不作为GC的模式被禁止,但任何JVM AFAIK都不支持它,因为它有许多限制,包括性能,内存使用和循环引用。我知道C ++使用它,但与托管内存系统相比,它是一种黑客攻击。

注意:MappedByteBuffers出于某些目的使用引用计数。这是一个孤立的用例。

有一个纯粹的并发收藏家,其中最受欢迎的是Azul。 http://www.azulsystems.com/zing/pgc注意:它应该被称为"暂停更少"而不是"暂停"因为它大大减少了GC相关的暂停,但并没有完全消除它们。 (它通常用于Java中的低延迟交易系统。)

如果您真的担心GC暂停,最好的办法是避免使用Java RMI。它被设计成一个"全脂肪"功能齐全的RPC可以完成许多您可能从未想过的事情。序列化不是非常有效并且会产生大量垃圾。使用更具针对性的RPC解决方案可以将垃圾减少90-99%或更好。

答案 1 :(得分:1)

检查Java的网站:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

基本上有几个垃圾收集器可用。我已经在生产系统上运行并行收集器了很长一段时间,但谷歌搜索将告诉你G1也表现出很大的承诺。

答案 2 :(得分:0)

  

为什么在RMI系统中不推荐使用mark-and-sweep GC?

我不知道这意味着什么。 RMI使用来自Modula-3的分布式垃圾收集算法(DGC),该算法使用引用计数等,但它与JVM垃圾收集完全分开。我从来没有听说过你提到过的建议。请引用。我不确定这句话是否有意义。更改'推荐'方便的'根据你的评论,它并没有真正帮助。

  

是否可以在不挂起应用程序本身的情况下在并行线程中运行GC"引用计数" -algorithm?

当前的JVM中没有引用计数算法,但据我所知,GC确实在自己的线程中运行。 RMI DGC也是如此。

简而言之,你的问题没有意义。