2011-03-09 90 views
6

我有一个由Web托管公司托管的Java应用程序。每隔几天,我的应用程序宕机用: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) 

托管公司说,这意味着我的应用程序正在泄漏内存,但我已经都出现了空闲内存的工具仍然是可用的。由于错误总是创建一个新的本地线程,我认为问题出在JVM config/OS资源中。

如何防止发生此错误?

回答

1

你有做记忆追踪吗?启动jconsole并观看或记录24小时内的内存消耗。如果它平均上升而没有回落,那么你的内存不足,可能没有足够的内存来存储新线程的细节。

7

它最有可能是Web服务器端JVM的问题。请查看以下链接的一些细节,

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

+5

也有可能是只创建了太多的线程应用程序的问题 - 如文中提到,更多的线程==可与调整来解决更多的本地存储空间的使用。这个假设需要的线程数合法应用程序。但如果应用程序产生线程并从不杀死它们(线程泄漏),那么没有任何调整将会修复它。也可能是操作系统对每个进程的线程数有限制。 – 2011-03-09 23:18:33

+0

是否有任何简单的方法从java代码本身获得与我的进程相关的线程数?由于这是一家虚拟主机公司的JVM,我几乎不能访问JVM级别的工具。尽管我可以测试我的代码(这是我为获取JVM内存信息所做的)。 – tvfoodmaps 2011-03-09 23:33:48

+0

有没有办法AFAIK,但托管公司有支持团队谁可以转储线程给你,如果你教他们如何。 – 2011-03-10 02:35:11

2

当你打开的过程中,虚拟机有一个有限的堆大小(默认为128MB)。该服务器可能有更多的内存,但是你的JVM不会 - 你全部使用了。

您可以用-Xms-Xmx命令行参数改变这一点,但我会建议先查找内存泄漏:)

+3

我不相信我会得到OOM消息“无法创建新的本地线程”的一部分,如果这是一个标准的内存泄漏。 – tvfoodmaps 2011-03-09 23:35:35

+0

了解我使用这个词在最一般的意义,因为没有办法来分配直接在Java内存再失去它的轨道就像你可以在C.你是如何清理这些线程开始呢? – 2011-03-10 03:20:01

+0

谢谢,arduino出现这个错误并且使用Xms100m解决了它! – Ramast 2018-01-09 20:45:23

0

看起来像线程泄漏。线程被创建,但随后卡在某个地方。定期转储线程以查看分配的线程数量是否增长。查找转储中的任何睡眠/悬挂线程。

kill -QUIT jvm_pid 
1

它是与Linux的问题来处理节数打开的文件 给出如下 的ulimit -n 65536 (任何数量的u能给予)

5

一种可能性是,你已经达到了你的用户限制打开文件的数量。

我相信每个进程/线程都会消耗一个或多个文件描述符。例如,当你的用户发生这种情况时,“no”shell命令将起作用,因为shell命令分离出要执行的进程(你会看到像“-bash:fork:retry:Resource暂时不可用”的错误)

我遇到了这个问题,发现只有当前用户无法产生特效...其他用户不受影响。

解决,你的ulimit-n(最大文件打开)设置...详细信息如下。

你可以在命令行看看你的用户限制:

ulimit -a 

最多你用下面的最大文件限制:

ulimit -n 65536 

这里是我现在所拥有的:

$ 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 

要查看所有为您的系统明确的限制:

cat /etc/security/limits.conf 

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

+0

我也遇到了麻烦与Eclipse月神在Fedora 20,我读了很多关于不同的内存选项,仍然无法弄清楚的问题。这让我疯狂。 最后我意识到,默认情况下,普通用户在Fedora上的进程数量非常有限。限制的内容.d/90-nproc.conf: * soft nproc 1000 将此提升到5000固定我的“无法创建新的本地线程”问题。 – arpadf 2014-10-08 09:37:02

相关问题