Java:无法创建新的 native 线程

标签 java out-of-memory

我有一个由网络托管公司托管的 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)

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

如何防止此错误发生?

最佳答案

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

我相信每个进程/线程都会消耗一个或多个文件描述符。

例如,当您的用户发生这种情况时,“no”shell 命令将起作用,因为 shell 命令会 fork 一个进程来执行(您会看到类似“-bash: fork: retry: Resource temporarily unavailable”的错误)

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

要解决这个问题,请提高您的 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 - 不同发行版的结果可​​能略有不同。

关于Java:无法创建新的 native 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5253072/

相关文章:

java - 有没有更好的方法来处理从某些数据源抛出的异常?

java - 如何通过J2ME存储大图像

android - BitmapFactory.decodeStream() 返回一个 Bitmap ~100 倍于原始

java - SQLite java 内存使用量不断增加,直到出现内存不足异常

java - Android格式化带时区的日期

java - 了解 Java/Spring Web 应用程序中的 junit.framework.AssertionFailedError

java - Heroku[web.1] : State changed from starting to crashed

java - Apache Spark 应用程序路径中的冒号

java - 如何通过生成线程来命中 java.lang.OutOfMemoryError?

c++ - “virtual memory exhausted: Cannot allocate memory”仅在使用调试标志进行编译时