注意: 写该文章主要帮助自己记忆,贴出来希望可以给有同样问题的人解惑,不喜勿喷,可以提意见哦。
问题描述:
java.io.FileNotFoundException: /mnt/sda/sda1/STBDebugInfo11999911081020140101000141/STBPs.txt: open failed: EMFILE (Too many open files);
Caused by: libcore.io.ErrnoException: open failed: EMFILE (Too many open files);
原因:
对于内核而言,所有打开的文件都是通过文件描述符引用。文件描述符是一个非负整数。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。
文件描述符的变化范围是0-OPEN_MAX。不同的系统OPEN_MAX是不同的。
早期的UNIX系统实现才有的上限值是19(允许每个进程最多打开20个文件),但是现在很多系统则将其增至63。对于FreeBSD5.2.1、Mac Os X 10.3以及Solaris 9,文件描述符的变化范围实际是没有上限的,它只收到系统配置的存储器总量,整形的字长以及系统管理员所配置的软限制和硬限制的约束。Linux2.4.22对于每个进程的文件描述符书的硬限制是1048576。
所以当文件描述符用完后,就会报该问题。