没有垃圾回收的 JVM
2022-09-02 09:02:40
我在很多线程中读到,在Sun的JVM上关闭垃圾回收是不可能的。但是,为了我们的研究项目,我们需要此功能。任何人都可以推荐一个没有垃圾回收或允许关闭它的JVM实现吗?谢谢。
我在很多线程中读到,在Sun的JVM上关闭垃圾回收是不可能的。但是,为了我们的研究项目,我们需要此功能。任何人都可以推荐一个没有垃圾回收或允许关闭它的JVM实现吗?谢谢。
我想找到一种快速的方法将所有对象保存在内存中,以进行简单的初始概念证明。
执行此操作的简单方法是使用一个非常大的堆来运行 JVM,以至于 GC 永远不需要运行。将 和 选项设置为较大的值,然后打开 GC 日志记录以确认 GC 在测试期间未运行。-Xmx
-Xms
这将比修改JVM更快,更直接。
(事后看来,这可能行不通。我依稀记得看到过一些证据,暗示JVM并不总是尊重-Xms
设置,特别是如果它真的很大。尽管如此,在尝试一些更困难的方法之前,这种方法还是值得尝试的......就像修改JVM一样。
此外,这整件事对我来说是不必要的(甚至适得其反),因为你实际上试图实现的目标。GC 不会丢弃对象,除非它们是垃圾。如果它们是垃圾,您将无法使用它们。并且禁用/否定GC的系统的性能并不能指示实际应用程序的性能。
更新 - 从Java 11开始,您可以使用Epsilon(no-op)垃圾回收器的更简单的选择;看
您可以在启动 JVM 时添加以下选项:
-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
当堆被填满时,不会尝试收集垃圾。相反,Epsilon GC 会终止 JVM。
根据您的需求,这可能有效:
使用 -Xbootclasspath 选项,您可以指定自己的 API 类实现。例如,您可以重写 Object 的实现,并向构造函数中添加 a 以防止对对象进行垃圾回收。这当然是一个黑客,但对于简单的案例研究来说,这也许就足够了。globalList.add(this)
另一种选择是采用开源jvm并注释掉启动垃圾回收的部分。我想这并不复杂。