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配置/操作系统资源中.
如何防止此错误发生?
它很可能是Web服务器端JVM的问题.有关详细信息,请查看以下链接,
http://blog.egilh.com/2006/06/2811aspx.html
一种可能性是您已达到打开文件数量的用户限制.
我相信每个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 - 发行版之间的结果可能略有不同.
你做过记忆追踪吗?启动 jconsole 并观察或记录 24 小时内的内存消耗情况。如果它(平均而言)上升而没有下降,那么您的内存不足,并且可能没有足够的内存来存储新线程的详细信息。
| 归档时间: |
|
| 查看次数: |
45658 次 |
| 最近记录: |