【发布时间】:2016-08-26 01:10:21
【问题描述】:
我读过why is it bad practice to call System.gc(),还有很多其他的,例如this one 描述了对 System.gc() 的真正灾难性滥用。但是,在某些情况下,GC takes too long 和避免长时间的停顿(例如,avoiding garbage)并不是很简单,并且会使代码更难维护。
恕我直言,在以下常见情况下手动调用 GC 是可以的:
- 有多个可互换的网络服务器,它们前面有故障转移。
- 每台服务器都使用几 GB 的堆,STW 暂停所用的时间比平均请求长得多。
- 故障转移不知道 GC 何时发生。
- 故障转移可以在被告知时免除服务器。
算法看起来很简单:周期性地选择一个服务器,让它不再有请求发送给它,让它完成它正在运行的请求,让它做它的 GC,然后重新激活服务器。
我想知道我是否遗漏了什么?1,2
有什么选择?
长时间运行的请求可能是个问题,但我们假设没有。或者只是将等待时间限制在与 GC 所需时间相当的一段时间。让一个缓慢的请求变得更慢听起来还不错。
-XX:+DisableExplicitGC之类的选项可能会使算法无用,但不要使用它(我的用例包括我负责的专用服务器)。
【问题讨论】:
-
imo 如果没有损坏,请不要修复它。如果您没有看到内存导致的性能瓶颈,那何必担心呢?
-
@MitchWeaver 同意,只有在您确定自动 GC 无法执行您想要的操作时,您才应该尝试控制它。
-
@MitchWeaver 我称之为刨。许多项目都遇到了 GC 问题,所以我也应该期待它们。知道有一个好的解决方案让我现在不用担心。我的问题的原因是每个人都声称“天堂禁止呼叫 GC!”之类的东西,所以我正在寻找确认。
标签: java performance garbage-collection failover