让我们假设我在生产Unix机器上有足够的内存。我有一个Java后端应用程序,它不会使用那么多堆。初步测试显示100MB似乎很好。 但是,当没有上限时,内存会增长到1GB甚至更长。 我可能不在乎是否不是因为应用程序所属的处理流似乎每时每刻都在窒息。一个可能的(非常模糊的)解释是罪魁祸首是提到的Java应用程序。
问题:可能是因为没有多余的垃圾将垃圾收集推迟了很长时间,以至于当垃圾收集最终开始时,它有“很多事情要做”,它会明显影响性能?
我应该提一下,我们仍在运行Java 1.4(非常古老的系统)。
答案 0 :(得分:2)
如果你不需要它上限。是的,你是正确的,给Java程序提供了太多的堆空间'可能'导致垃圾收集器线程运行更长的时间。什么是“太多”取决于您的计划的要求。我没有硬数据来支持这一点,我已经看到过这种情况发生在基于Java的生产级服务器上。 Java 1.7(最新版本)可能不会出现与Java 1.4相同的问题。
答案 1 :(得分:1)
GC时间随着堆的大小增长是正确的。更大的堆意味着更多的GC工作。但是,即使有几GB的堆,你应该看到Full GC周期大约需要2-3s。你看到这样的" chokes"或者你的窒息时间更长?
通常,可以容忍使 GC时间<5%总应用程序运行时间。
此外,很难归咎于GC,如果您能向我们展示一些GC日志会很有帮助。