【问题标题】:How much memory does a Tomcat thread take?一个Tomcat线程占用多少内存?
【发布时间】:2012-02-13 20:02:19
【问题描述】:

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

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

我想我可以进行一些测试并自己进行测量,但我希望有人已经这样做了并且可以分享或指出结果。

【问题讨论】:

  • 虚拟内存?物理内存?
  • 是的 :-) 任何可用的信息。也许对于 Java 来说更有趣的问题是 PermGenSpace 与 Heap 等等。
  • 您是否担心避免因虚拟内存不足而导致的内存不足错误?还是您担心物理内存不足导致的性能问题?

标签: tomcat memory threadpool


【解决方案1】:

消耗的额外物理内存实际上根本没有。除非线程确实工作,否则操作系统不会浪费物理内存来保存其堆栈或相关结构。 (当然,它可能会消耗 一些 物理内存,因为它会创建初始堆栈。但如果线程未运行,则可以并且将会在不损害性能的情况下进行分页。 )

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

如果由于线程堆栈中的虚拟内存用完而遇到错误,最好的选择可能是增加虚拟内存限制。虚拟内存限制的目的是间接限制物理内存的使用——物理内存的使用不会超过虚拟内存的使用。但是,如果您使用的编程模式(如大量线程)会消耗虚拟内存而没有相应地使用物理内存,那么限制就会在不应该的时候发挥作用。

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

减少最大线程堆栈大小也是一种选择。虽然这是一种妥协。如果线程在其生命周期内需要大量堆栈,则较大的 maximum 可防止线程引发异常。唯一消耗的资源是地址空间,这通常很便宜。但是,您可以对程序施加的唯一实际限制是限制虚拟内存,以防止其物理内存不足和性能不佳。所以你真正想要的旋钮不存在。

【讨论】:

  • 如果 Tomcat 至少使用了一次附加线程来处理请求,该怎么办。它仍然“有效地免费”吗?我想知道有多少开销。
  • 它实际上是免费的,就物理内存的消耗而言,当它实际上没有被使用时,因为最近没有使用过的内存总是有资格进行分页。把它翻出来一次,它就再也不会打扰你了。
【解决方案2】:

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

【讨论】:

  • 这是主要的虚拟内存使用情况。
  • 堆栈空间在堆外,但仍会导致 OutOfMemoryExceptions。每个线程的默认值可以高达 1MB(必须为您的 JVM 查找默认值)
  • 正确,但不会使用 1MB 的 物理 内存。所以这是否重要取决于他问的原因。
  • 我想我没明白你的意思。一切都是虚拟内存,直到它被交换成物理内存。这些堆栈在使用时绝对会占用物理内存,否则它们将无法使用。如果您有 1MB 的堆栈大小、100 个线程以及正在使用这些线程的服务器,那么您将有 100MB 的物理内存在使用中。那么,你想说什么?
  • 你知道这是总内存还是Java看到的?我认为本机线程也需要一些内存?
【解决方案3】:

根据我所见,一个新的空闲线程将占用大约 20KB - 50KB 的内存

从那里开始,它可以根据堆栈深度(嵌套方法调用)以及参数和局部变量的数量(方法参数和局部变量中的所有原语和指针被添加到堆栈中)随着运行而增长。而对象本身放在堆上)。

工作负载(当线程工作时)会增加一些内存使用量,然后在请求完成时它会被清除。但是,您不能将此归因于新线程,因为工作负载必须由一个线程或另一个线程承担。

长话短说:一个额外的线程将增加大约 0.05 MB 的内存使用量。

注 1: 线程数似乎有每个进程的限制。因此,Linux 实现可能允许单个 JVM 创建最多 1000 或 2000 个线程。

因此,您必须确保应用程序中的所有线程池加起来少于 2000 个线程。否则,当超出该限制时,JVM 可能会突然崩溃。

注2: JVM NMT 错误地报告 Java 8 提交的内存,自动将其设置为保留内存。参考:https://bugs.openjdk.java.net/browse/JDK-8191369

【讨论】:

    猜你喜欢
    • 2012-06-17
    • 2023-04-03
    • 2017-02-06
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 2010-09-13
    相关资源
    最近更新 更多