我在许多帖子中读到,无法在Sun的JVM上关闭垃圾收集。然而,为了我们的研究项目,我们需要这个功能。有人可以推荐一个没有垃圾收集或允许关闭它的JVM实现吗?谢谢。
我在许多帖子中读到,无法在Sun的JVM上关闭垃圾收集。然而,为了我们的研究项目,我们需要这个功能。有人可以推荐一个没有垃圾收集或允许关闭它的JVM实现吗?谢谢。
-Xmx
和-Xms
选项设置为较大的值,并打开GC日志以确认在测试期间GC不会运行。这比修改JVM更快且更直接。
事后看来,这可能行不通。我依稀记得看到的证据表明JVM并不总是尊重-Xms设置,特别是如果它非常大。尝试这种方法仍然值得一试,然后再尝试一些更困难的方法...比如修改JVM。
此外,整个过程让我觉得对于您实际想要实现的目标来说是不必要的(甚至是适得其反的)。除非它们是垃圾,否则GC不会丢弃对象。如果它们是垃圾,您将无法使用它们。禁用/抵消GC的系统的性能不会反映出真实应用程序的性能。
更新 - 从Java 11开始,您可以选择使用更简单的选项,即使用Epsilon(无操作)垃圾收集器;请参见
在启动JVM时,您需要添加以下选项:
-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
globalList.add(this)
以防止对象被垃圾回收。这虽然是一种 hack 方法,但对于简单的案例研究可能已足够。如果没有必要(否则您的应用程序将耗尽内存),并且如果您不需要GC,则可以关闭GC。如果不需要GC,它就不应该运行。
最简单的选择是不丢弃任何对象,这将避免执行GC(并将最大内存设置得非常高,以便您不会耗尽内存)。
您可能会发现,在启动时会发生GC,并且您可以考虑在运行时接受无GC。
这个问题很久了,但对于可能感兴趣的人来说,有一个提议:
开发一个只处理内存分配但不实现任何实际的内存回收机制的GC。一旦可用的Java堆耗尽,执行有序的JVM关机。
你能获取一个开源的JVM并禁用它的GC,例如Sun's Hotspot吗?
如果没有垃圾回收,你会期望像这样的代码语义是什么?
public myClass {
public void aMethod() {
String text = new String("xyz");
}
}
看看Oracle的JRockit JVM。我在Intel硬件上使用这个JVM时看到了非常好的近确定性性能,您可以使用Mission Control实用程序来探测运行时的性能。
虽然您无法完全关闭GC,但我相信您可以使用-Xnoclassgc选项禁用类的收集。 GC可以调整为最小化延迟,但会导致内存消耗增加。如果您选择这条路,您可能需要许可证将延迟降至所需的水平。
还有一个实时版本的JRockit JVM可用,但我认为没有免费提供给开发者使用的版本。
实际上有一种肮脏的方法可以暂时暂停GC。首先在Java中创建一个虚拟数组。然后,在JNI中使用GetPrimitiveArrayCritical函数获取指向该数组的指针。Sun JVM将禁用GC以确保该数组永远不会移动,并且指针保持有效。要重新启用GC,可以在指针上调用ReleasePrimitiveArrayCritical函数。但是这非常特定于实现,因为其他VM实现可能会固定对象而不是完全禁用GC。(已在Oracle Jdk 7和8上测试可行)
如果我遇到这个问题,我会选择IBM的Jikes Research Virtual Machine,因为:
你不能永远关闭GC,因为Java程序确实会分配内存,最终你会耗尽内存,但是你可以通过告诉JVM在堆变得非常大之前不要开始收集来延迟GC的时间,这在你的实验期间可能是可行的。(这个技巧在其他JVM上也可能有效,但我不知道在哪里找到旋钮来启动它。)
main
方法的数组还是字符串。这时候为什么不选择一个更合适的语言呢? - RecursiveExceptionException