java.net.SocketException: Too many open files在错误影响到基础 TCP 协议时抛出
为什么发生此问题?
这些异常指出操作系统 (OS) 资源问题和操作系统与 JVM 进程用完文件描述符的原因
在几个并发用户连接到服务器之后通常会发生此问题。Java 打开许多文件,以便读取运行应用程序所必需的类。大量应用程序会使用许多文件描述符,这会导致缺乏新的文件描述符。同样,每个新的套接字都需要一个描述 符。客户端和服务器通过 TCP 套接字进行通信。在与服务器建立连接时,每个浏览器的 http 请求都使用 TCP 套接字。
一定要首先监视文件描述符并了解这些诊断方法如何告知您有关打开文件的状态和其它潜在问题。在针对操作系统逐步执行此故障排除部分之后,可能有必要增加文件描述符的数量.
监视文件描述符
解决方法指导原则
下面是一般指导原则和考虑事项:
- 确定文件描述符的总数是否太少或者某些文件描述符是否未被正确释放。
- 如果此数量有所减少,则应当增加文件描述符的最大数量,以防止该问题再次发生。
- 如果此数量一直增加,则应当确定某些描述符的处理时间是否过长(文件没有正确地关闭)以及所创建的文件是否过多(例如,驱动程序库一直为每个新的 JDBC 连接加载文件)。
- 加载 jar 文件还可能减少所使用的文件描述符的数量。每个 jar 文件都使用一个描述符,即使每个单独加载的单一类都将使用一个描述符时也是如此。
您可以使用下列指导原则来监视和诊断所有描述符如何由一个进程使用(这取决于您的操作系统)。
检查打开的文件
lsof -p <进程的 pid>
示例 1以下命令在 Solaris 2.7 启动 WLS 8.1SP1 后立即执行。它表明运行服务器的 Java 进程 (pid 390) 分配了 84 个文件描述符,此数量远小于文件描述符缺省的硬极限。
$ lsof -p 390 | wc -l
84 在异常出现之后可以执行此命令,以确保此 Java 进程达到了打开文件的最大数量。这将确认该进程缺乏文件描述符。 然后,您可以运行 $ lsof -p <pid> 并将输出结果重定向到某个文件以检查打开的每个文件。如果某个应当关闭的文件却出现在列表中,您可以探查此文件以前没有按照预期方式关闭的原因。 下面是 lsof 的输出结果片断: |
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 29733 usera cwd VDIR 176,22 4096 4300274 /home/usera/810/user_projects/mydomain java 29733 usera txt VREG 176,22 36396 6642305 /home/usera/810/jdk141_02/bin/java java 29733 usera txt VREG 176,22 1251192 10818087 /home/usera/810/user_projects/mydomain/myserver/.wlnotdelete/extract/myserver_uddi_uddi/ jarfiles/_wl_cls_gen.jar java 29733 usera txt VREG 176,22 511935 10074851 /home/usera/810/user_projects/mydomain/myserver/.wlnotdelete/extract/myserver_uddi_uddi/ jarfiles/WEB-INF/lib/jsse39153.jar java 29733 usera txt VREG 176,22 2305960 6000676 /home/usera/810/user_projects/mydomain/myserver/.internal/uddi.war java 29733 usera txt VREG 176,22 1227013 1385413 /home/usera/810/weblogic81/common/eval/pointbase/lib/pbserver44.jar java 29733 usera txt VREG 176,22 653661 69379 /home/usera/810/weblogic81/server/lib/ant/ optional.jar |
lsof .h 显示所有可能的语法和选项。此程序的最新版本可在以下网址中找到:http://ftp.cerias.purdue.edu/pub/tools/unix/sysutils/lsof/ 。 文件描述符将用于每个套接字连接, lsof 还可以显示套接字的类型(TCP 或 UDP)以及监听地址和端口(位于名称列中)。 |
Windows 平台 Handle 在 WinNT 或 Windows 2000 上,命令行工具 handle 报告有关引用所打开文件的句柄的信息,如下例所示。此工具可用于特定进程, 它可从以下网址获得:http://www.sysinternals.com/ntw2k/freeware/handle.shtml 。 |
C:\tmp>ps -ef | grep java usera 1656 1428 0 10:11:41 CONIN$ 0:46 c:\Releases\WLS8.2\JDK141~1\bin\java -client -Xms32m -Xmx200m -XX:MaxPermSize=128m -Xverify:none -Dweblogic.Name=myserver -Dweblogic.ProductionModeEnabled= -Djava.security.policy="c:\Releases\WLS8.2\WEBLOG~1\server\lib\weblogic.policy" weblogic.Server |
C:\tmp>handle -p java Handle v2.10 Copyright (C) 1997-2003 Mark Russinovich Sysinternals - www.sysinternals.com ------------------------------------------------------------------------------ java.exe pid: 1656 ABCDEF\usera 18: File C:\Releases\WLS8.2\user_projects\domains\mydomain 170: File C:\Releases\WLS8.2\jdk141_05\jre\lib\rt.jar 178: File C:\Releases\WLS8.2\jdk141_05\jre\lib\sunrsasign.jar 180: File C:\Releases\WLS8.2\jdk141_05\jre\lib\jsse.jar 188: File C:\Releases\WLS8.2\jdk141_05\jre\lib\jce.jar 190: File C:\Releases\WLS8.2\jdk141_05\jre\lib\charsets.jar 328: File C:\Releases\WLS8.2\jdk141_05\jre\lib\ext\dnsns.jar 330: File C:\Releases\WLS8.2\jdk141_05\jre\lib\ext\ldapsec.jar 338: File C:\Releases\WLS8.2\jdk141_05\jre\lib\ext\localedata.jar 340: File C:\Releases\WLS8.2\jdk141_05\jre\lib\ext\sunjce_provider.jar 348: File C:\Releases\WLS8.2\jdk141_05\lib\tools.jar 350: File C:\Releases\WLS8.2\weblogic81\server\lib\weblogic.jar 358: File C:\Releases\WLS8.2\weblogic81\server\lib\jconn2.jar 360: File C:\Releases\WLS8.2\weblogic81\server\lib\ojdbc14.jar 368: File C:\Releases\WLS8.2\weblogic81\server\lib\xmlx.jar 370: File C:\Releases\WLS8.2\weblogic81\server\lib\webservices.jar 378: File C:\Releases\WLS8.2\weblogic81\server\lib\wlcipher.jar 3e0: File C:\Releases\WLS8.2\weblogic81\server\lib\ant\ant.jar 3e8: File C:\Releases\WLS8.2\weblogic81\server\lib\EccpressoJcae.jar 3f0: File C:\Releases\WLS8.2\weblogic81\server\lib\EccpressoCore.jar 3f8: File C:\Releases\WLS8.2\weblogic81\server\lib\EccpressoAsn1.jar 400: File C:\Releases\WLS8.2\weblogic81\server\lib\jConnect.jar 408: File C:\Releases\WLS8.2\weblogic81\server\lib\ant\optional.jar 410: File C:\Releases\WLS8.2\weblogic81\server\lib\ant\jakarta-oro-2.0.7.jar …. C:\tmp>handle -p java | wc -l 65 |
这表明在 Windows 上运行 WLS 8.1SP2 时使用了 65 个文件句柄。 |
Linux
管理用户可以在 etc/security/limits.conf 配置文件中设置他们的文件描述符极限,如下例所示。
hard nofile 4096
系统级文件描述符极限还可以通过将以下三行添加到 /etc/rc.d/rc.local 启动脚本中来设置:
echo 4096 > /proc/sys/fs/file-max
echo 16384 > /proc/sys/fs/inode-max
Windows
在 Windows 操作系统上,文件描述符被称作文件句柄。在 Windows 2000 服务器上,打开文件的句柄极限设置为 16,384。此数量可以在任务管理器的性能摘要中监视。
轉自:http://hi.baidu.com/bluesnake/blog/item/d267e350019a85591138c2f2.html