何时收集垃圾

Sav*_*sis 8 java garbage-collection findbugs

我有一段代码在内存中加载了一个非常大的图像.所以打电话似乎是合理的

System.gc();
Run Code Online (Sandbox Code Playgroud)

在加载图像之前.据我所知,它没有任何问题.

昨天我决定使用一个名为FindBugs的非常有用的软件来扫描你的代码,并报告可能导致错误或一般不建议策略的问题.问题是我提到的这段代码被报道了.描述如下:

...强制垃圾收集; 除了在基准测试代码中,这是非常可疑的

它继续详细说明:

代码显式调用垃圾收集.除了在基准测试中的特定用途外,这是非常可疑的.

在过去,人们在诸如close或finalize方法之类的例程中明确调用垃圾收集器的情况导致了巨大的性能黑洞.垃圾收集可能很昂贵.强制数百或数千个垃圾收集的任何情况都会导致计算机爬行.

所以我的问题是:在这种情况下以编程方式调用垃圾收集器是不是可行的?我的代码只调用一次,它所使用的方法很少使用.如果调用它不行,那么在进行内存密集型操作之前需要尽可能多的内存并且需要释放尽可能多的内存之前,应该怎么办呢?

nos*_*nos 9

通常情况下,GC比您更聪明,因此最好让它在运行时决定时运行.如果运行时需要内存,它将运行GC本身

  • 你永远不会"知道"你有一个杂乱无章的内存布局.如你所知,GC可能刚刚运行.即使你没有收集任何东西,标记和扫描的"标记"部分也需要资源和时间.这就是为什么它几乎总是一个净负面或(最佳情况)收支平衡案例,试图超越GC. (2认同)

cla*_*amp 9

您是否通过System.gc()获得了任何性能改进?我不这么认为,因为在加载图像之前你可能没有很多需要收集的对象.

通常现代垃圾收集者在运行时最了解,所以你不应该强制收集,除非你有一个非常好的理由.(例如,该插件建议的基准测试应用程序)

顺便说一句:调用System.gc()建议VM执行"完整"或"大"集合,这意味着很快就会停止所有线程.否则它可能只会产生"小"垃圾收集,而不会停止所有线程.

使用-verbose:gc运行程序以查看收集的字节数.

这里还有很多关于垃圾收集的技术信息:http: //java.sun.com/developer/technicalArticles/Programming/GCPortal/

  • System.gc()不会"强制"任何东西.VM可以自由忽略它.Javadoc中的措辞是"调用gc方法*建议*Java虚拟机花费精力回收未使用的对象"(强调我的) (4认同)
  • 正如Adrian所说,-1为FAILING读取System.gc()上的javadoc,它没有任何力量.http://stackoverflow.com/questions/1147511/how-can-i-estimate-amount-of-memory-left-with-calling-system-gc/1149182#1149182 for realforcing gc (2认同)