问题描述:

  今天一个同事反映程序有问题,让帮忙查看后台日志,发现后台日志报错的信息如下:

  1. java.net.SocketException: Too many open files
  2. at java.net.Socket.createImpl(Socket.java:460)
  3. at java.net.Socket.connect(Socket.java:587)
  4. at org.apache.commons.net.SocketClient.connect(SocketClient.java:163)
  5. at org.apache.commons.net.SocketClient.connect(SocketClient.java:184)
  6. at com.asiainfo.goods.wo.store.scheduler.util.FtpUtil.downloadFileByFileName(FtpUtil.java:270)
  7. at com.asiainfo.goods.wo.store.scheduler.job.TargetUserJob.dealWithFtpByRequestId(TargetUserJob.java:186)
  8. at com.asiainfo.goods.wo.store.scheduler.job.TargetUserJob.execute(TargetUserJob.java:80)
  9. at com.asiainfo.goods.presale.scheduler.job.QuartzJobFactory.execute(QuartzJobFactory.java:68)
  10. at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
  11. at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
  12. 2018-04-08 18:45:00 [com.asiainfo.goods.wo.store.scheduler.job.TargetUserJob]-[ERROR]:216 - file doesnot exist===TARGETCUSTU00011201
  13. 804081800575321.zip

问题分析:

  通过以上的错误提示可以知道,是程序打开太多的文件导致的.

解决过程:

1.查看当前系统用户下设置的打开文件的上限

  1. [aiprd@host-10-191-5-227 log]$ ulimit -a
  2. core file size (blocks, -c) 0
  3. data seg size (kbytes, -d) unlimited
  4. scheduling priority (-e) 0
  5. file size (blocks, -f) unlimited
  6. pending signals (-i) 256705
  7. max locked memory (kbytes, -l) 64
  8. max memory size (kbytes, -m) unlimited
  9. open files (-n) 65536
  10. pipe size (512 bytes, -p) 8
  11. POSIX message queues (bytes, -q) 819200
  12. real-time priority (-r) 0
  13. stack size (kbytes, -s) 10240
  14. cpu time (seconds, -t) unlimited
  15. max user processes (-u) 20000
  16. virtual memory (kbytes, -v) unlimited
  17. file locks (-x) unlimited

备注:当前用户下,每个进程最多可以打开65536个文件描述符.

2.查看应用程序进程当前已经打开的进程数

  1. [aiprd@host-10-191-5-227 log]$ lsof -p 2526 | wc -l
  2. 65785

备注:当前应用程序打开的文件65785显然是超过了65536的限制,导致进程后续无法打开新的文件.

3.通过lsof命令针对单独的进程查看发现大量的deleted的文件

备注:很多文件已经不存在了,但是,文件的描述符还是打开的.

  1. [aiprd@host-10-191-5-227 log]$ lsof -p 2526 | grep deleted | wc -l
  2. 65274

备注:deleted的文件有65274个.可见,大部分的文件描述符占用都是deleted的文件.

4.将应用程序进程关闭,释放打开的文件

  1. [aiprd@host-10-191-5-227 log]$ kill -9 2526
  2. [aiprd@host-10-191-5-227 log]$ lsof -p 2526 | wc -l
  3. 0

5.重启应用程序,并且查看打开的文件

  1. [aiprd@host-10-191-5-227 log]$ ps -ef | grep scheduler_hdfs | grep -v grep | awk '{print $2}'
  2. 29639
  3. [aiprd@host-10-191-5-227 log]$ lsof -p 29639 | wc -l
  4. 485
  5. [aiprd@host-10-191-5-227 log]$ lsof -p 29639 | grep deleted | wc -l
  6. 0

备注:应用程序重启之后,之间打开的文件都释放掉了.后台程序可以正确的进行处理.

文档创建时间:2018年4月8日21:25:33

java程序后台报错java.net.SocketException: Too many open files的更多相关文章

  1. MapReduce 程序运行报错 java.lang.ClassNotFoundException解决方法

    在创建自定义的Mapper时候,编译正确,但上传到集群执行时出现错误: 11/16/05 22:53:16 INFO mapred.JobClient: Task Id : attempt_20111 ...

  2. 后台报错java.lang.IllegalArgumentException: Invalid character found in the request target.

    报错: Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level. java.lang ...

  3. Java Web项目报错java.lang.NullPointerException at org.apache.jsp.front.index_jsp._jspInit(index_jsp.java:30)

    环境:myeclipse+tomcat6+jdk6 今天搭建了一个Java Web项目,访问index.jsp时报如下错误: 严重: Servlet.service() for servlet jsp ...

  4. 关于 64位系统 java连接access 报错java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序

    报错的原因是url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=E:/公司/2000.mdb"; 这样是不行 ...

  5. java 连接Kafka报错java.nio.channels.ClosedChannelExcep

    Java 客户端连接Kafka报如下错误 java.nio.channels.ClosedChannelExcep 是由于Kafka server.properties中的advertised.hos ...

  6. Java连接MongoDB报错“java.lang.IllegalArgumentException: clusterListener can not be null”的解决办法

    我使用的MongoDB版本是3.6.9. 下面是一个很基础的示例代码,功能就是连接MongoDB: package com.zifeiy.snowflake.handle.etl.mongodb; i ...

  7. java转换编码报错java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern

    Exception in thread "main" java.lang.IllegalArgumentException: URLDecoder: Illegal hex cha ...

  8. java 连接 elasticsearch 报错java.lang.NoClassDefFoundError: org/apache/http/auth/Credentials 解决

    您的问题是您在应用程序类路径中缺少必需的JAR(这导致ClassNotFound异常).如果您下载了包含IP Camera驱动程序(webcam-capture-driver-ipcam-0.3.10 ...

  9. java连接sqlserver2008报错 java.sql.SQLException: 对象名 '表名' 无效.

    注意:c3p0的数据库配置方式为: <named-config name="sqlsvr"> <property name="driverClass&q ...

随机推荐

  1. linux io ports io memory

    http://m.blog.csdn.net/article/details?id=7204458

  2. thread-local-allocation-buffers

    https://www.azul.com/files/Whats-inside-a-JVM-webinar-presentation.pdf https://www.zhihu.com/questio ...

  3. JIT IR,C2

    A Simple Graph-Based Intermediate Representation http://www.oracle.com/technetwork/java/javase/tech/ ...

  4. configure new Linux/Mac

    vim   http://www.cnblogs.com/wswang/p/5088078.html sublime   http://jingyan.baidu.com/article/3aed63 ...

  5. Extjs加载本地的一个json文件

    <head>    <title></title>    <link href="../Styles/Extjs/resources/css/ext ...

  6. 在eclipse中配置server和database

    配置server,以tomcat为例 点击下图的tag 如果没有,就去这里找: 然后右键:new->server,根据你安装的server选择版本,然后finish就行了 然后你右键那个serv ...

  7. ssh 移植记录

    利用buildroot 先编译一个 sshd cd buildroot-2016.05/ make menuconfig Target packages ---> Networking appl ...

  8. Linux kernel 找到gpio被占用位置

    一开始是通过断点 printk看哪里申请这个GPIO正常哪里不正常,发现这种方法太繁琐. 经过同事提醒,直接在 drivers/gpio/gpiolib.c 里面的 gpio_request 里面添加 ...

  9. m72 gprs模块的应用编写

    #include <fcntl.h>#include <termios.h>#include "AppInit.h"#include "A5_Se ...

  10. 一站式学习Wireshark(三):应用Wireshark IO图形工具分析数据流

    基本IO Graphs: IO graphs是一个非常好用的工具.基本的Wireshark IO graph会显示抓包文件中的整体流量情况,通常是以每秒为单位(报文数或字节数).默认X轴时间间隔是1秒 ...