错误如下图:
错误已经说得很清楚了,打开了太多的文件,通过ulimit -a查看linux的默认最大文件句柄为:1024。
我们可以在/etc/security/limits.conf 修改配置该值,但是这种方法治标不治本。
我们使用lsof -p 60071(其中60071为出错进程的进程号)查看进程都有哪些打开的文件句柄,发现有大量如下句柄,这是上传文件时,undertow在tmp中生成的临时目录。
引起此问题的代码如下:
通过查看代码,没有看到InputStream关闭的地方(在putObject里也没有)。初步判断问题出这这里。修改代码如下,测试OK:
总结:原则:最好在任何时候使用InputStream或者OutputStream的时候,在finally中调用close()方法,显式关闭。