在所有用户定义的方法中调用System.gc()是否很好

时间:2015-07-03 09:07:06

标签: java garbage-collection

在我的所有Java方法中调用System.gc()是一个好习惯吗?

示例:我有一个班级。在所有函数的return语句之前,我试图调用System.gc()函数。这是对的吗?

5 个答案:

答案 0 :(得分:4)

没有。几乎不需要调用System.gc(),因为垃圾收集是自动的,JVM知道它在做什么。

正如马努蒂所说,这种方法只是一个建议。如果您连续多次调用System.gc(),有可能“强制”运行GC,但总而言之,担心垃圾收集器不是您的工作。

如果您需要影响GC的工作方式,可以通过提供命令行参数来选择不同的采集算法并按照here所述调整参数来实现。

答案 1 :(得分:1)

从应用程序代码调用System.gc()是一个坏主意 1 。经常打电话是一个可怕的想法。

运行GC是一项相对昂贵的操作,尤其是在没有必要运行它的情况下运行它。并且应用程序很少有可用的信息来了解何时有必要。

Java运行时可以更好地处理何时以及如何有效地运行垃圾收集器。让它自己做出决定。

参考:

  

示例:我有一个班级。在所有函数的return语句之前,我试图调用System.gc()函数。这是对的吗?

绝对不是。

1 - 有一个或两个边缘情况,在生产代码中调用System.gc()是合理的。但是,这些都是一个很小的例外。

答案 2 :(得分:0)

不,这不是好习惯,至少在所有方法中都没有。如果方法调用的数量很大并且为GC分配了更多的时间(并且取决于GC的类型),它甚至可能导致性能开销。

此外,System.gc()的行为是不可预测的,如文档所暗示的那样:

  

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

答案 3 :(得分:0)

您打电话或不致电System.gc()并不重要。

无法保证GC会启动并且很可能无法运行,因为JVM确定运行GC的位置要比开发人员更明智。

答案 4 :(得分:0)

  

在我所有的Java方法中调用System.gc()是一个好习惯吗?

您根本不需要在程序中调用System.gc()。这不是一个好习惯。即使你这样做,也不确定jvm会在你的命令上运行垃圾收集器。

尽量避免在班级中创建不必要的对象。如果你不需要它,请尊重他们。点击How garbage collector works in Java

确保代码中没有memory leaks

  

是否需要明确调用System.gc()..?如果是的话,哪里可以   我叫..?

system-gc-invocation-a-suitable-scenario