System.gc()用于垃圾收集

时间:2013-10-11 10:37:47

标签: java

我的代码是:

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

程序员可以在java中使用System.gc()进行垃圾收集吗?它更受欢迎吗? JVM会自动执行,那么程序员为什么要调用System.gc()

4 个答案:

答案 0 :(得分:2)

你可以打电话给它。这不会有任何伤害。但是,没有任何人相信你所期望的对象的记忆会立即获得免费。

更多JVM以异步方式运行GC,我们无需驱动它。 JVM智能足以释放记忆。

只是出于明白目的,没关系,如果你真的想要因XYZ原因而清除记忆,那么你的程序结构中肯定存在设计缺陷。

答案 1 :(得分:2)

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

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

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

  • 你知道大量内存已无法访问。
  • 必须快速释放这么多内存。
    • 您的程序即将进入时间紧急状态,GC循环应尽可能晚(或根本不发生),因此在您输入之前执行GC循环很有帮助那状态。
  • 您至少对目标环境的GC工作原理有一个大概了解。
  • 您已经确认该GC的策略在当时不适合您的方案。

答案 2 :(得分:1)

即使您使用System.gc(),也无法保证将释放内存

来自oracle网站的

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

答案 3 :(得分:1)

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

Java堆内存根据对象生成分为三个区域。过度简化:年轻,成人和老年人。当发生对GC的调用时,首先要检查“年轻区域”是否有未使用的对象并释放它们。如果GC没有释放“年轻区”中的记忆,则检查“成人区”。如果GC没有释放“成人区”中的内存,则会检查“旧区域”。 GC检查的每一代都比上一代更昂贵。

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