2012-01-19 85 views
3

如果我将我的Tomcat线程池从N增加到N + 1个线程,需要多少额外内存?Tomcat线程需要多少内存?

当然,我的应用程序可能会负责一些额外的内存,但让我们忽略这一点,我只是感兴趣的Tomcat需要多少。

我想我可以运行一些测试并自己测量它,但我希望有人已经做到了,并且可以共享或指向结果。

+0

虚拟内存?物理内存? –

+0

是的:-)无论有什么信息可用。对于Java来说,更有趣的问题可能是它是否是PermGenSpace和堆等。 –

+0

您是否关心避免虚拟内存不足导致的内存不足错误?或者是由于物理内存不足导致您担心性能问题? –

回答

1

我相信主要的内存使用量将是每个线程分配的堆栈空间。这可以在命令行上通过-Xss

+0

这是主要的*虚拟*内存使用情况。 –

+0

堆栈空间位于堆外部,但仍会导致OutOfMemoryExceptions。每个线程的默认值可高达1MB(必须查找JVM的默认值) – rfeak

+0

正确,但不会使用1MB *物理*内存。所以这个问题取决于他为什么要问。 –

3

消耗的额外物理内存根本无效。除非线程确实工作,否则操作系统不会浪费物理内存来存放堆栈或相关结构。 (当然,它可能会消耗一些物理内存,当然,因为它会创建初始堆栈,但是如果线程没有运行,它可以并且不会损坏性能。)

但是,线程的堆栈将消耗虚拟内存。您可以调整线程的最大堆栈大小,并且它是控制消耗多少虚拟内存的最大堆栈大小。如果线程刚好在那里,它就是免费的。即使它不消耗实际的有限资源,它也会计入虚拟内存限制。

如果您遇到由于线程堆栈中的虚拟内存不足而导致错误,那么可能您最好的选择是增加虚拟内存限制。虚拟内存限制的目的是限制间接使用物理内存 - 物理内存的使用不会超过虚拟内存的使用。但是如果你使用虚拟内存而不使用物理内存的编程模式(比如很多线程),那么当它们不应该使用物理内存时,限制就会发生。

当然,32位进程基本上仅限于2GB,3GB或4GB的虚拟内存(取决于平台)。所以你可能别无选择,只能减少最大的线程堆栈大小。 (线程立即消耗等于其最大堆栈大小的虚拟内存,因为即使从未使用过地址空间也必须保留地址空间)。

减少最大线程堆栈大小也是一个选项。尽管这是一个妥协。较大的最大值可以防止线程在其生命周期中需要大量堆栈时导致异常。所消耗的唯一资源是地址空间,这通常很便宜。但是,对程序强加的唯一实际限制是为了限制虚拟内存,以防止它在物理内存上运行不足并且性能不佳。所以你真正想要的旋钮不存在。

+0

如果Tomcat至少使用了一次附加线程来提供请求,该怎么办?它仍然是“有效免费”吗?我想知道有多少开销。 –

+0

从物理内存的消耗来看,它实际上没有实际使用,因为最近未使用的内存总是符合分页的条件,所以它是免费的。一页一页,它再也不会让你烦恼。 –