【问题标题】:Garbage collection in JAVA (Mark-and-sweep and Reference Counting)JAVA 中的垃圾收集(标记和清除和引用计数)
【发布时间】:2014-04-24 12:12:18
【问题描述】:

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

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

  2. 是否可以在不暂停应用程序本身的情况下在并行线程中运行 GC“引用计数”算法?

提前致谢。

【问题讨论】:

  • 能否在RMI系统不推荐mark-and-sweep的声明中添加链接?
  • @Jens Schauder:对不起,我错了,我关于 RMI 分布式系统的问题可能是“在 RMI 分布式系统中使用 GC 标记和清除有什么不方便的地方?”谢谢
  • 如果您想澄清您的问题,请编辑问题。

标签: java collections garbage-collection rmi distributed


【解决方案1】:

为什么RMI系统不推荐mark-and-sweep GC?

我不相信。

是否可以在不暂停应用程序本身的情况下在并行线程中运行 GC“引用计数”算法?

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

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

有一个纯粹的并发收集器,其中最受欢迎的是 Azul。 http://www.azulsystems.com/zing/pgc 注意:它实际上应该被称为“pauseless”而不是“pauseless”,因为它显着减少了与 GC 相关的暂停,但并没有完全消除它们。 (在 Java 中常用于低延迟交易系统。)

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

【讨论】:

  • 感谢您的回答,我关于mark-and-sweep的问题可能是“在RMI分布式系统中使用GC mark-and-sweep有什么不方便的地方?”。我在澄清我的问题时是错误的。谢谢!
【解决方案2】:

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

基本上有几个可用的垃圾收集器。我在生产系统上运行 Parallel 收集器已经有一段时间了,但是谷歌搜索会告诉你 G1 也显示出很好的前景。

【讨论】:

    【解决方案3】:

    为什么RMI系统不推荐mark-and-sweep GC?

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

    是否可以在不暂停应用程序本身的情况下在并行线程中运行 GC“引用计数”算法?

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

    总之你的问题没有意义。

    【讨论】:

      猜你喜欢
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      • 2014-11-08
      • 2018-06-10
      相关资源
      最近更新 更多