【问题标题】:JVM with no garbage collection没有垃圾收集的 JVM
【发布时间】:2010-06-05 10:44:52
【问题描述】:

我在许多线程中读到不可能在 Sun 的 JVM 上关闭垃圾收集。但是,出于我们研究项目的目的,我们需要此功能。任何人都可以推荐一个没有垃圾收集或允许关闭它的 JVM 实现吗?谢谢。

【问题讨论】:

  • 没有垃圾收集的Java,就像C/C++一样!!!
  • 根据forums.java.net/jive/thread.jspa?messageID=208939&tstart=0 的说法,gc 可以在早期版本的 Java 中被禁用,但现在已经不可能了。
  • @Mitch Wheat,没有。它与 C++,没有缓冲区溢出,几乎没有未定义的行为。
  • @Longpoke:没有 GC 也没有内存回收,所以你会疯狂地泄漏。
  • @HH:我找不到需要禁用 gc 的地方。你需要它做什么?

标签: java garbage-collection jvm


【解决方案1】:

我想找到一种快速方法将所有对象保存在内存中,以进行简单的初步概念验证。

执行此操作的简单方法是使用一个非常大的堆运行 JVM,以使 GC 永远不需要运行。将-Xmx -Xms 选项设置为较大的值,并打开 GC 日志记录以确认 GC 在测试期间不会运行。

这将比修改 JVM 更快、更直接。


(事后看来,这可能行不通。我隐约记得看到暗示 JVM 并不始终尊重 -Xms 设置的证据,尤其是在它非常大的情况下。仍然,这种方法值得在尝试一些更困难的方法之前尝试……比如修改 JVM。)

另外,这整件事让我觉得对于你实际想要达到的目标来说是不必要的(甚至会适得其反)。 GC 不会丢弃对象,除非它们是垃圾。如果它们是垃圾,您将无法使用它们。禁用/否定 GC 的系统的性能并不能说明 真实 应用程序的性能。


更新 - 从 Java 11 开始,您可以更简单地选择使用 Epsilon(无操作)垃圾收集器;见

在启动 JVM 时添加以下选项:

-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC

当堆被填满时,不会尝试收集垃圾。相反,Epsilon GC 会终止 JVM。

【讨论】:

    【解决方案2】:

    根据您的需要,这可能会起作用:

    使用 -Xbootclasspath 选项,您可以指定自己的 API 类实现。然后,您可以例如覆盖 Object 的实现,并向构造函数添加 globalList.add(this) 以防止对象被垃圾收集。这肯定是个 hack,但对于简单的案例研究来说可能就足够了。

    另一种选择是采用开源 jvm 并注释掉启动垃圾收集的部分。我想这并不复杂。

    【讨论】:

    • 覆盖对象听起来是个绝妙的主意。但是当我尝试它时,它给了我一个带有巨大堆栈跟踪的错误。我认为这是有道理的,因为我想在 Object 的构造函数中执行的任何代码都需要调用 Object 的构造函数。
    • 好点。一个简单的 globalList.add(this) 可能会导致无限递归。你将不得不做一些更切碎的事情。例如,您可以实现自己的列表结构,将其排除在列表中。
    • 这会阻止世代收集的“小收集”循环吗?
    【解决方案3】:

    Sun 的 JVM 没有这样的选项。 AFAIK,没有其他 JVM 也有这个选项。

    您没有说明您到底想要实现什么,但您有以下两种选择之一:使用分析器并准确​​查看 GC 正在做什么,这样您就可以考虑其影响。另一种是从源代码编译其中一个 JVM,并从那里禁用 GC。

    【讨论】:

    • 感谢您的回答。我基本上是在分析 Java 程序。我想找到一种将所有对象保存在内存中的快速方法,以进行简单的初始概念验证。
    【解决方案4】:

    您只能在实际上不需要 GC 时关闭它(否则您的应用程序会耗尽内存),如果您不需要 GC,它也不应该运行。

    最简单的选择是不丢弃任何对象,这将避免执行 GC(并将最大内存设置得非常高,以免耗尽)。

    您可能会发现您在启动时会获得 GC,并且您可能会在可接受的运行时考虑使用 no-GC。

    【讨论】:

      【解决方案5】:

      这个问题很老,但是对于那些可能感兴趣的人,有一个建议

      开发一个只处理内存分配,但不实现任何实际内存回收机制的 GC。一旦可用的 Java 堆耗尽,执行有序的 JVM 关闭。

      JEP draft: Epsilon GC: The Arbitrarily Low Overhead Garbage (Non-)Collector

      【讨论】:

        【解决方案6】:

        也许您可以尝试让您的 VM 的可用内存足以让 GC 永远不会运行。

        我(尽管有限)的经验使我认为 VM 默认情况下非常懒惰并且非常不愿意运行 GC。

        提供 -Xmx 16384M(或类似的)并确保您的研究对象远低于该限制,可能会为您提供您希望获得的环境,尽管即使那样显然也不能保证。

        【讨论】:

          【解决方案7】:

          实际上存在一个临时暂停 GC 的肮脏技巧。首先在 Java 中创建一个虚拟数组。然后,在 JNI 中,使用 GetPrimitiveArrayCritical 函数来获取指向数组的指针。 Sun JVM 将禁用 GC 以确保数组永远不会移动并且指针保持有效。要重新启用 GC,可以在指针上调用 ReleasePrimitiveArrayCritical 函数。但这是非常特定于实现的,因为其他 VM impl 可能会固定对象而不是完全禁用 GC。 (经测试可在 Oracle Jdk 7 和 8 上运行)

          【讨论】:

            【解决方案8】:

            看看Oracle's JRockit JVM。我已经看到使用这个 JVM 在 Intel 硬件上具有非常好的近乎确定性的性能,您可以使用 Mission Control 实用程序来刺激和戳运行时,看看它的性能如何。

            虽然你不能完全关闭GC,但我相信你可以使用-Xnoclassgc选项来禁用类的收集。可以将 GC 调整为minimize latency,但代价是内存消耗会增长。如果您要走这条路线,您可能需要许可证才能将延迟降低到最低限度。

            还有一个可用的 JRockit JVM 实时版本,但我认为没有可供开发人员免费使用的版本。

            【讨论】:

              【解决方案9】:

              你能否获得一个开源 JVM 并禁用它的 GC,例如 Sun's Hotspot

              如果没有垃圾回收,您希望这样的代码的语义是什么?

              public myClass {
              
                    public void aMethod() {
              
                          String text = new String("xyz");
              
                    }
              
              }
              

              在没有 GC 的情况下,任何新的和具有堆栈范围引用的项都不能被回收。即使您自己的类可以决定不使用这样的局部变量,或者只使用原始类型,我也不知道您将如何安全地使用任何标准 Java 库。

              我很想了解更多关于您的使用场景的信息。

              【讨论】:

                【解决方案10】:

                如果我遇到这个问题,我会得到 IBM 的 Jikes Research Virtual Machine,因为:

                • 运行时系统是用 Java 本身编写的(带有特殊扩展)
                • 整个东西被设计成一个研究工具,并且相对容易调整。

                你不能永远关闭 GC,因为 Java 程序会分配内存,最终你会耗尽内存,但很有可能你可以在实验期间延迟 GC告诉 JVM 在堆变得非常大之前不要开始收集。 (这个技巧可能也适用于其他 JVM,但我不知道在哪里可以找到开始旋转的旋钮。)

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2011-02-23
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-11-12
                  • 1970-01-01
                  • 2023-03-07
                  • 2013-10-18
                  相关资源
                  最近更新 更多