2013-04-17 40 views
3

假设我在生产Unix盒子上有足够的内存。而且我有一个Java后端应用程序,它不会使用太多的堆。初步测试表明,100MB似乎很好。 但是,当不加限制时,内存会增长到1GB及以上。 我可能不会在乎,如果不是因为应用程序是其中一部分的处理流似乎窒息的事实。一个可能的(非常模糊的)解释是罪魁祸首就是提到的Java应用程序。如果你不需要那么多,你应该限制java堆大小吗?

问题问题:是不是让堆不必要的高延迟垃圾回收这么长时间,当它最终启动时,它有“很多事情要做”,它会明显影响性能?

我应该提到我们还在运行Java 1.4(漂亮的老系统)。

回答

1

您确定GC时间随着堆的大小而增长。更大的堆意味着更多的GC工作。但是,即使有几个GB的堆,你也应该看到完整的GC周期需要2-3s左右。你看到这样的“呛”还是你的窒息更长?

一般来说,它是可容忍GC时间< 5%的总应用程序运行时

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

+0

感谢您的回复。我会看看我能否得到一些gc日志。 –

2

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

相关问题