猿问

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

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

答疑关于如何Java中的无强制对象(这家伙正在清除1.5GB的HashMap)System.gc(),有人告诉我打电话是不好的做法System.gc()手工操作,但这些评论并不完全令人信服。另外,似乎没有人敢投我的票,也不敢投我的票。

我在那里被告知这是一种糟糕的做法,但后来我也被告知垃圾收集器的运行不会有系统地停止这个世界,而且它也可以有效地被JVM作为一个提示使用,所以我有点不知所措。

我确实理解,当JVM需要回收内存时,它通常比您更清楚。我也明白,担心几千字节的数据是愚蠢的。我也明白,即使是兆字节的数据也不是几年前的那样。但还是1.5G?而你内存中有大约1.5GB的数据,而不是黑暗中的镜头。是System.gc()有系统的坏,还是有什么时候,它变得好起来?

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

  • 为什么打电话不是不好的做法?

    System.gc()

    ?在某些实现下,它实际上只是对JVM的一个提示,还是始终是一个完整的集合周期?真的有垃圾收集器实现可以在不停止世界的情况下完成他们的工作吗?请解释一下人们在对我的评论中所作的各种断言。

    回答.

  • 门槛在哪里?是吗

    绝不可能

    打电话的好主意

    System.gc()

    或者有时候是可以接受的?如果是,那是什么时候?


波斯汪
浏览 1548回答 3
3回答

一只甜甜圈

很多人似乎都在告诉你不要这么做。我不同意。如果在像加载一个级别这样的大型加载过程之后,您认为:您有许多无法访问的对象,并且可能没有GC‘ed。和你认为用户现在可以忍受一个小小的减速。调用System.gc()没有坏处。我把它看作是c/c+inline关键词。这只是对GC的一个提示,您的开发人员认为时间/性能并不像通常那样重要,其中一些可以用于回收内存。建议不要依赖它,做任何事情都是正确的。不要依赖它的工作,但给出提示,现在是一个可以接受的时间收集是完全好的。我宁愿在代码中的某一点上浪费时间(加载屏幕),而不是当用户主动与程序交互时(比如在游戏的某个级别)。有一次我会力集合:当试图查找特定对象泄漏时(本机代码或大型、复杂的回调交互)。哦,还有任何一个UI组件,只要看一眼Matlab就行了。)这在生产代码中不应该使用。
随时随地看视频慕课网APP

相关分类

Java
我要回答