java.nio.file.FileSystemException: Too many open files

这个程序启动时跑的好好的,跑一晚上就会出问题,报错如下:

java.nio.file.FileSystemException: database: Too many open files

        at sun.nio.fs.UnixException.translateToIOException(UnixException.java:91)

        at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)

        at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)

        at sun.nio.fs.UnixFileSystemProvider.newDirectoryStream(UnixFileSystemProvider.java:427)

        at java.nio.file.Files.newDirectoryStream(Files.java:589)

        at org.drinkless.tdlib.example.data.Record.syncAccounts(Record.java:120)

        at org.drinkless.tdlib.example.task.MainTask.getTask(MainTask.java:73)

        at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

        at java.lang.reflect.Method.invoke(Method.java:498)

        at org.drinkless.tdlib.example.task.State.next(State.java:82)

        at org.drinkless.tdlib.example.task.State.run(State.java:29)


应该是打开的文件数量超过了系统的上限导致的,使用 lsof -p pid | wc -l  查看进程打开的文件数:

java    4568 root    3r   REG              253,0  72959474   33818935 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64/jre/lib/rt.jar

java    4568 root    4r   REG              253,2   4842440 1073741983 /home/tdjava/2/tdjava-all.jar

java    4568 root    5w   REG              253,2  38445155 1073741926 /home/tdjava/2/client.log

java    4568 root    6w   REG              253,2 103067118 1073741928 /home/tdjava/2/tdlib.log

java    4568 root    7r   REG              253,0    736006   33818926 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64/jre/lib/jsse.jar

java    4568 root    8u  unix 0xffff8800a74aa800       0t0     974935 socket

java    4568 root    9r   CHR                1,8       0t0          9 /dev/random

java    4568 root   10r   CHR                1,9       0t0         10 /dev/urandom

java    4568 root   11r   CHR                1,8       0t0          9 /dev/random

java    4568 root   12r   CHR                1,8       0t0          9 /dev/random

java    4568 root   13r   CHR                1,9       0t0         10 /dev/urandom

java    4568 root   14r   CHR                1,9       0t0         10 /dev/urandom

java    4568 root   15r   REG              253,0    107934   33818924 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64/jre/lib/jce.jar

java    4568 root   16r   REG              253,0     30583     140337 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64/jre/lib/ext/sunec.jar

java    4568 root   17r   REG              253,0    295008     140338 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64/jre/lib/ext/sunjce_provider.jar

java    4568 root   18r   REG              253,0   3507901   33818934 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64/jre/lib/resources.jar

java    4568 root   19u  unix 0xffff8801fda47400       0t0     958880 socket

java    4568 root   20u  IPv6             958882       0t0        TCP bogon:57192->101.200.82.233:8801 (ESTABLISHED)

java    4568 root   21r   DIR              253,2       131 3221225610 /home/tdjava/2/database

java    4568 root   22r   DIR              253,2       131 3221225610 /home/tdjava/2/database

java    4568 root   23r   DIR              253,2       131 3221225610 /home/tdjava/2/database

java    4568 root   24r   DIR              253,2       131 3221225610 /home/tdjava/2/database

java    4568 root   25r   DIR              253,2       131 3221225610 /home/tdjava/2/database

java    4568 root   26r   DIR              253,2       131 3221225610 /home/tdjava/2/database

java    4568 root   27r   DIR              253,2       131 3221225610 /home/tdjava/2/database

java    4568 root   28r   DIR              253,2       131 3221225610 /home/tdjava/2/database

java    4568 root   29r   DIR              253,2       131 3221225610 /home/tdjava/2/database

java    4568 root   30r   DIR              253,2       131 3221225610 /home/tdjava/2/database

java    4568 root   31r   DIR              253,2       131 3221225610 /home/tdjava/2/database

java    4568 root   32r   DIR              253,2       131 3221225610 /home/tdjava/2/database

java    4568 root   33r   DIR              253,2       131 3221225610 /home/tdjava/2/database

其中 /home/tdjava/2/database 被打开了N次,却没有关闭。检查代码,应该是流没有关闭:

修改为:

提醒自己注意使用完资源一定要考虑,是不是需要释放。

发表评论