相关疑难解决方法(0)

为什么调用System.gc()是不好的做法?

回答了关于如何用Java强制释放对象的问题(这个人正在清除一个1.5GB的HashMap)后System.gc(),我被告知System.gc()手动调用是不好的做法,但这些评论并不完全令人信服.此外,似乎没有人敢投票,也没有人回答我的回答.

我被告知这是不好的做法,但后来我也被告知垃圾收集器运行不再系统地停止世界,并且它也可以有效地被JVM用作提示,所以我有点像茫然

我知道JVM在需要回收内存时通常比你知道的要好.我也明白,担心几千字节的数据是愚蠢的.我也明白,甚至数兆字节的数据也不是几年前的数据.但仍然,1.5千兆字节?而且你知道内存中有1.5 GB的数据; 它不像是在黑暗中拍摄.是System.gc()系统性的坏,还是有一点它变得好吗?

所以问题实际上是双重的:

  • 打电话为什么或不是不好的做法System.gc()?它是否仅仅是某些实现中JVM的提示,还是一个完整的收集周期?真的有垃圾收集器实现可以在不停止世界的情况下完成工作吗?请详细说明人们在评论中对我的回答所做的各种断言.
  • 门槛在哪里?打电话是不是一个好主意System.gc(),或者有时候可以接受?如果是这样,那些时候是什么时候?

java garbage-collection

317
推荐指数
7
解决办法
12万
查看次数

显式调用System.gc()?

据说我们不能garbage collection在java中强制进程.
毕竟,它是一个守护程序线程.

但有时候,为什么我们System.gc( );明确地调用函数?
值得一试吗?任何Pro和Con的?
如果在许多情况下没用,为什么不从Java中弃用此方法?

PS:用例子说明会很有用

java garbage-collection daemon

15
推荐指数
3
解决办法
1万
查看次数

何时收集垃圾

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

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

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

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

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

它继续详细说明:

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

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

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

java garbage-collection findbugs

8
推荐指数
2
解决办法
1475
查看次数

标签 统计

garbage-collection ×3

java ×3

daemon ×1

findbugs ×1