【问题标题】:ActiveMQ OutOfMemory Can't create more threadsActiveMQ OutOfMemory 无法创建更多线程
【发布时间】:2010-12-20 23:53:16
【问题描述】:

我正在模拟服务器过载,但出现此错误:

java.lang.OutOfMemoryError: unable to create new native thread

我在此页面中读到http://activemq.apache.org/javalangoutofmemory.html,我可以增加内存大小。但是我该怎么做呢?我需要修改哪个文件,?我试图通过 bin/activemq 脚本传递参数,但没有成功。

【问题讨论】:

    标签: java activemq


    【解决方案1】:

    您的案例对应于massive number of threads。 解决方法有3种:

    • 减少线程数(即文档中的-Dorg.apache.activemq.UseDedicatedTaskRunner=false
    • 通过 -Xss 选项减少每个线程的堆栈大小(默认值:Win/Linux 上 32 位 Java 为 320 KiB,Win/Linux 上 64 位 Java 为 1024 KiB,请参阅@ 987654322@)
    • 减少(不扩展)堆大小-Xmx选项为每个线程堆栈腾出空间(ActiveMQ 脚本中默认为 512 MiB)

    注意:如果栈或堆太小,一定会导致另一个OutOfMemoryError

    您可以使用 ACTIVEMQ_OPTS shell 变量(在 UNIX 中)指定它们。 例如,将 ActiveMQ 运行为

    ACTIVEMQ_OPTS=-Xss160k bin/activemq
    

    【讨论】:

      【解决方案2】:

      Check here

      为运行 ActiveMQ 的 VM 指定 -Xmx 参数 - 例如,Tomcat。

      【讨论】:

      • 我在cli中运行,即bin/activemq,我没有在容器上运行activemq
      • 我在链接上查看过,但我不明白。
      【解决方案3】:

      您可以使用 -Xmx 命令参数为 Java 虚拟机分配更多内存。
      例如。 java -Xmx512M MyClass

      【讨论】:

      • 如何使用 activemq 做到这一点?
      【解决方案4】:

      我们在 Linux (RedHat Enterprise 5) 系统上遇到了这个问题,发现在这个构建中,/etc/security/limits.conf 中的 nprocs ulimit 实际上控制了用户可以生成的线程数。

      您可以使用ulimit -a 命令查看此限制。

      开箱即用,这被设置为软限制 100 和硬限制 150,这与运行现代应用服务器所需的线程数相比非常不足。
      我们完全取消了这个限制,它为我们解决了这个问题。

      【讨论】:

        【解决方案5】:

        这看起来不像堆空间用完了,所以不要增加它(-Xmx 选项)。相反,您的应用程序正在耗尽进程内存,减少堆空间将释放进程内存以供本机使用。问题是,为什么要使用这么多进程内存?如果你不使用 JNI,你可能创建了太多线程,habe 的帖子已经解释了如何解决这个问题。

        【讨论】:

          猜你喜欢
          • 2011-03-30
          • 1970-01-01
          • 2023-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多