`
DavisWang
  • 浏览: 51314 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

未关闭java.nio.channels.SocketChannel可导致Too many open files

 
阅读更多
    在调用静态open方法创建java.nio.channels.SocketChannel对象后,必须调用close方法关闭SocketChannel对象以释放创建的文件句柄(fd)资源,否则如果不断地创建SocketChannel对象会使得打开文件的句柄数达到系统设定的上限,从而出现 “Too many open files”的问题。
     现象:1)通过netstat -n | wc -l 查看连接数并不多; 2)系统或jvm报Too many open files; 3)通过命令ls -l /proc/<pid>/fd | grep socket |wc -l 查看有大量与socket关联的文件句柄。
     原因分析:
    下面是java.nio.channels.SocketChannel的open方法,该方法调用SelectorProvider.provider().openSocketChannel()创建SocketChannel对象。
public static SocketChannel open() throws IOException {
        return SelectorProvider.provider().openSocketChannel();
}
    我们先看SelectorProvider.provider()返回的对象。如果没有提供自定义的SelectorProvider实现,SelectorProvider.provider()会返回sun.nio.ch.DefaultSelectorProvider.create()创建的SelectorProvider对象,在linux下是sun.nio.ch.EPollSelectorProvider。
     sun.nio.ch.EPollSelectorProvider的openSocketChannel()方法继承了sun.nio.ch.SelectorProviderImpl的实现,而sun.nio.ch.SelectorProviderImpl的openSocketChannel()直接返回创建的sun.nio.ch.SocketChannelImpl对象,其构造函数如下:
    SocketChannelImpl(SelectorProvider sp) throws IOException {
        super(sp);
        this.fd = Net.socket(true);
        this.fdVal = IOUtil.fdVal(fd);
        this.state = ST_UNCONNECTED;
    }

    sun.nio.ch.Net.socket(boolean stream)的实现如下:
    static FileDescriptor socket(boolean stream) {
        return IOUtil.newFD(socket0(stream, false));
    }
    IOUtil.newFD的实现如下
    static FileDescriptor newFD(int i) {
        FileDescriptor fd = new FileDescriptor();
        setfdVal(fd, i);
        return fd;
    }
    可见,在创建SocketChannelImpl对象时创建了一个文件句柄,尽管这个文件句柄尚未和socket绑定,但已经开始占用系统的fd资源。所以在使用SocketChannel后一定要调用close()方法,尤其是在创建socket时出现异常时,一定要调用SocketChannel.close()方法将fd资源关闭/释放,否则就会出现上面的现象连接数不高,但文件句柄数很高。

分享到:
评论

相关推荐

    Java.NIO资源下载资源下载

    Java.NIO资源下载资源下载

    java org.apache.http.nio jar包

    找了好久,终于找到了,java刷新同步获取网络资源

    Java.nio 与Java.io比较

    Java.nio 与Java.io比较

    JDK1.7 之java.nio.file.Files 读取文件仅需一行代码实现

    下面小编就为大家分享一篇JDK1.7 之java.nio.file.Files 读取文件仅需一行代码实现,具有很好的参考价值,希望对大家有所帮助

    java.io:clojure.java.io 的 JK7 java.nio.file.Path 兼容性

    下面的示例用法( require 'me.moocar.java.io)( require '[clojure.java.io :as jio])( import '(java.nio.file Paths))( def p ( Paths/get " /tmp " ( into-array [ " foo " ])))( with-open [writer ( jio/...

    优雅的操作文件:java.nio.file 库介绍.pdf

    但 Java 在后期版本中引入了 java.nio.file 库来提高 Java 对文件操作的能力。还增加的流的功能,似乎使得文件变成更好用了。所以本章,我们就来主要介绍 java.nio.file 中常用的类和模块,大致如下: Path 路径:...

    The_Study_about_Java.nio.rar_java nio

    java.nio包的学习总结,看看确实有收获

    java NIO详细教程

    java NIO详细教程,包括使用背景,实现原理,代码实现

    Java.NIO_网络编程_入门讲解

    Java.NIO_网络编程_入门讲解,初学者适合的资料

    java.nio新功能的优点

    java 1.4中推出的java.nio(新输入/输出)软件包允许像在其他低级语言——如C语言——中一样进行输入/输出。许多开发者认为这些新功能只能进行非阻塞操作;但是,这些新功能提供许多其他新鲜有趣的特性,它们包括:...

    Java.nio

    NULL 博文链接:https://shihuan830619.iteye.com/blog/1159544

    nio:Clojure对java.nio的支持

    o Clojure对java.nio的支持。 将clojure.java.io的输入流,输出流和复制功能扩展到java.nio类。 定义新的强制功能缓冲区,字节缓冲区,字符缓冲区,双缓冲区,浮点缓冲区,整数缓冲区,长缓冲区,短缓冲区,通道,可...

    Apress.Pro.Java.7.NIO.2.2011

    Apress.Pro.Java.7.NIO.2.2011

    Java_NIO类库Selector机制解析.doc

    Java_NIO类库Selector机制解析.docJava_NIO类库Selector机制解析.docJava_NIO类库Selector机制解析.docJava_NIO类库Selector机制解析.doc

    java.nio(socket异步通讯完整版)

    重新写的Java.nio的socket异步通讯,包含客户端及服务端完整版, 注:解析信息CLASS及进制转换CLASS需要自己去写,项目直接导入,需要自己写一些解析及转换类,这样你才能读懂SOCKET的异步,否则光拿代码没用 ...

    nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio

    java nio 编程一个实例子.服务端程序

    java.nio demo

    Java的IO操作集中在java.io这个包中,是基于流的同步(blocking)API。对于大多数应用来说,这样的API使用很方便,然而,一些对性能要求较高的应用,尤其是服务端应用,往往需要一个更为有效的方式来处理IO。从JDK ...

    java nio.doc

    java.nio.charset 包中定义了字符集 API,java.nio.channels 包中定义了信道和选择器 API。每个子包都具有自己的服务提供程序接口 (SPI) 子包,SPI 子包的内容可用于扩展平台的默认实现或构造替代实现。

Global site tag (gtag.js) - Google Analytics