Java:无法创建新的本机线程

tvf*_*aps 8 java out-of-memory

我有一个由Web托管公司托管的Java应用程序.每隔几天我的应用就会失败:

[2011-03-09 15:52:14,501] ERROR http-12021-9 
java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:597)
Run Code Online (Sandbox Code Playgroud)

托管公司表示这意味着我的应用程序正在泄漏内存,但我现有的工具显示可用内存仍然可用.由于错误总是创建一个新的本机线程,我的想法是问题出在JVM配置/操作系统资源中.

如何防止此错误发生?

Tay*_*yab 8

它很可能是Web服务器端JVM的问题.有关详细信息,请查看以下链接,

http://blog.egilh.com/2006/06/2811aspx.html

  • 它也可能是一个问题,应用程序只是创建了太多的线程 - 正如文章所提到的,更多的线程==更多的本机空间内存使用,可以通过调整解决..这假定应用程序所需的合法线程数.但是如果应用程序产生线程并且永远不会杀死它们(线程泄漏)那么没有多少调整会修复它.也可能是操作系统对每个进程的线程数有限制. (5认同)

jat*_*tal 6

一种可能性是您已达到打开文件数量的用户限制.

我相信每个Process/Thread都会消耗一个或多个文件描述符.

例如,当您的用户发生这种情况时,"no"shell命令将起作用,因为shell命令分叉执行的进程(您会看到诸如"-bash:fork:retry:Resource temporary unavailable"之类的错误)

我遇到了这个问题,发现只有当前用户无法生成过程...其他用户不受影响.

要解决,请启动ulimit -n(最大文件打开)设置...详细信息如下.

您可以使用以下命令查看用户限制:

ulimit -a
Run Code Online (Sandbox Code Playgroud)

使用以下内容提高最大文件限制:

ulimit -n 65536 
Run Code Online (Sandbox Code Playgroud)

这就是我现在所拥有的:

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 256797
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 75000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 100000
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
Run Code Online (Sandbox Code Playgroud)

要查看系统的所有显式限制:

cat /etc/security/limits.conf
Run Code Online (Sandbox Code Playgroud)

请注意:我正在使用Oracle Linux 6.3 - 发行版之间的结果可能略有不同.


Edw*_*uck 1

你做过记忆追踪吗?启动 jconsole 并观察或记录 24 小时内的内存消耗情况。如果它(平均而言)上升而没有下降,那么您的内存不足,并且可能没有足够的内存来存储新线程的详细信息。