-1

我的代码是:

class Test{
    Test c=new Text();
    System.out.println(c.size());
    System.gc();
}

程序员可以System.gc()在java中使用垃圾收集吗?它是可取的吗?JVM自动执行,那程序员为什么要调用System.gc()呢?

4

4 回答 4

2

System.gc()向 GC 发送请求以执行收集周期。该请求可能会被提供,也可能会被忽略,因此不应依赖任何结果。

垃圾回收周期将自动发生(您无需任何操作),通常是在负责分配新对象的一代已满或根本无法满足分配请求时。

在大多数情况下,您根本不需要System.gc()在代码中调用。System.gc()应在与以下类似条件适用的少数情况下使用:

  • 您知道大量内存刚刚变得无法访问。
  • 必须快速释放此数量的内存。
    • 或者你的程序即将进入一个时间紧迫的状态,GC 周期应该尽可能晚地发生(或根本不发生),因此在你进入该状态之前执行一个 GC 周期是有帮助的。
  • 你至少对目标环境的 GC 是如何工作的有一个大概的了解。
  • 您已经验证了该 GC 的策略此时对于您的方案不是最佳的。
于 2013-10-11T10:55:19.657 回答
2

你可以调用它。这样做不会有什么坏处。但是,您所期望的对象的内存是否会立即释放并没有保证。

更多 JVM 异步运行 GC,我们不需要驱动它。JVM足够智能以释放内存。

只是为了了解目的是可以的,如果您真的考虑出于XYZ 某种原因清除内存,那么您的程序结构中肯定存在设计缺陷。

于 2013-10-11T10:41:00.357 回答
1

你可以调用它,但不保证内存会被释放。此外,如果内存被释放,这可能会对程序的执行产生负面影响。我会尽力向你解释,但我注意到你我的英语不是很好 XD

Java 堆内存根据对象生成分为三个区域。过于简单化:年轻人、成年人和老年人。当发生对 GC 的调用时,首先它会检查“年轻区”是否有未使用的对象并释放它们。如果 GC 没有在“年轻区”中释放足够多的内存,它会检查“成人区”。如果 GC 没有在“成人区”释放足够多的内存,它会检查“旧区”。GC 检查每一代的成本都比上一代高。

好吧,对象最初是在年轻区域中创建的,如果 GC 在年轻区域执行并且该对象仍在使用,则该对象将传递到成人区域。成人同上 -> 旧区。如果调用 GC 的执行,它可以认为年轻对象是成人对象的候选对象,并将其移动到成人区域。这会导致您的成人区域以不必要的方式增长。之后,当 GC 必须检查成人区时,操作对他来说成本更高,并且您的程序性能可能会下降。

于 2013-10-11T11:02:00.997 回答
1

即使你使用System.gc()也不能保证内存会被释放

来自oracle站点 调用 gc 方法表明 Java 虚拟机花费精力回收未使用的对象,以使它们当前占用的内存可用于快速重用。当控制从方法调用返回时,Java 虚拟机已尽最大努力从所有丢弃的对象中回收空间。

于 2013-10-11T10:38:46.177 回答