在我的所有Java方法中调用System.gc()
是一个好习惯吗?
示例:我有一个班级。在所有函数的return语句之前,我试图调用System.gc()
函数。这是对的吗?
答案 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()..?如果是的话,哪里可以 我叫..?