System.gc() 代号一

System.gc() in Codename One

System.gc() (https://www.codenameone.com/javadoc/java/lang/System.html#gc--) 是否在代号一中做了什么?

我在 XCode 中分析 Ram 时在 Codename One 应用程序中尝试过它,但 System.gc() 似乎被忽略了。

System.gc() 已实现,但它是异步的,因为 GC 是一个单独的线程。您不应该正常调用它,因为它确实会严重影响性能。我们不支持测量可用 RAM 的数量。这在 multi-tasking OS 中有点难做到。 Java 通过使用 Xmx 标志来解决这个问题,但这很愚蠢,因为我们想继续占用 OS 为我们提供的 RAM。如果 OS 发送 RAM 低事件,我们 运行 GC 隐式。

System.gc() 的行为。

  • 它可能会同步执行垃圾回收。
  • 它可能会触发异步垃圾回收。
  • 可以完全忽略。

实际发生的情况取决于平台,并且取决于 JVM 选项。例如,有一个 JVM 选项指示 JVM 完全忽略System.gc().

的调用

但是,这应该没有实际意义。

在大多数情况下调用 System.gc() 是个坏主意:

  • 效率低下。事实上,在最坏的情况下,它的效率低得可怕。
  • 如果您这样做是因为您的应用程序在 space 中是 运行,那将无济于事。
  • 如果你这样做是因为内存泄漏,那将无济于事。
  • 如果你这样做是因为你有资源泄漏,它可能无济于事。
  • 如果您试图鼓励 JVM "give memory back" 到 OS,它可能无济于事。 (在 JVM 返回内存之前通常需要几个完整的 GC 周期。如果您的应用程序的堆要求是循环的,JVM 可能会再次向 OS 请求内存。)

在大多数情况下,以上问题都有更好(更有效,更有效)的解决方案。例如,获取更多物理内存、增加堆大小或查找并修复内存和资源泄漏。

一般来说,最好让JVM自己来管理垃圾回收。在大多数情况下,它可以比您的应用程序做得更好。