3

假设我在生产 Unix 机器上有足够的内存。而且我有一个不使用那么多堆的 Java 后端应用程序。初步测试表明 100MB 看起来还不错。但是,当不设上限时,内存会增长到 1GB 及以上。如果不是因为应用程序所属的处理流不时出现阻塞,我可能不会在意。一种可能的(非常模糊的)解释是罪魁祸首是提到的 Java 应用程序。

问题:是否将堆放在不必要的高位会使垃圾收集延迟很长时间,以至于当它最终启动时,它“要做的事情太多”以至于明显影响性能?

我可能应该提到我们仍在运行 Java 1.4(相当旧的系统)。

4

2 回答 2

2

如果您不需要它,请盖上它。是的,您是正确的,为 Java 程序提供过多的堆空间“可能”会导致垃圾收集器线程运行更长的时间。什么是“太多”取决于您的程序的要求。我没有确凿的数据来支持这一点,我过去曾在基于 Java 的生产级服务器中看到过这种情况。Java 1.7(最新版本)可能不会出现与 Java 1.4 相同的问题。

于 2013-04-17T01:10:14.483 回答
1

GC 时间随着堆的大小而增长是正确的。更大的堆意味着更多的 GC 工作。但是,即使有几个 GB 的堆,您也应该看到 Full GC 周期大约需要 2-3 秒。你看到这样的“扼流圈”还是你的扼流圈更长?

一般来说,GC 时间小于应用程序总运行时间的5% 是可以容忍的。

此外,GC 也很难怪,如果您能向我们展示一些 GC 日志将会很有帮助。

于 2013-04-17T05:20:46.367 回答