java JDK 1.7:POSIX信号导致“打开的文件太多”?
我已经看过了其他类似的问题,但它们似乎是由其他问题引起的
首先,我确保明智地关闭了所有文件句柄,然后使用^{
它在我的整个运行时保持不变,但随后我会定期在lsof
中列出大约10000个条目,如下所示:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
...
java 36809 smm *235r PSXSEM 0t0 kcms00008FC901624000
java 36809 smm *236r PSXSEM 0t0 kcms00008FC901624000
java 36809 smm *237r PSXSEM 0t0 kcms00008FC901624000
java 36809 smm *238r PSXSEM 0t0 kcms00008FC901624000
java 36809 smm *239r PSXSEM 0t0 kcms00008FC901624000
手册页说PSXSEM
类型是POSIX信号量。知道JDK使用POSIX信号量做什么吗?顺便说一句,该应用程序目前是一个单线程命令行应用程序
潜在有用的背景:在Mac OS X 10.7.3上升级到JDK 1.7后,我第一次注意到这一点:
java version "1.7.0_04"
Java(TM) SE Runtime Environment (build 1.7.0_04-b21)
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode)
更新:在JDK1.6上重新发布$JAVA_HOME
似乎是解决这个问题的一种方法
java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04-415-11M3635)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01-415, mixed mode)
JDK1.7有什么不同之处
# 1 楼答案
更新:正如其他用户所说,ImageIO在1.7.0_04和1.7.0_05中泄漏了信号量。用户juancn和用户mckamey的错误报告已被标记为已修复和已关闭(谢谢大家!)。解释如下:
尽管他们的报告表明修复程序是在版本8中,但后端口报告表明它是fixed in 1.7.0_06.
因此,如果您在1.7.0_04或05上看到此问题,更新到至少1.7.0_06将解决此问题
# 2 楼答案
我可以追溯到这段代码:
JavaDocs特别指出,这种方法(与其他方法不同)会自动关闭流。事实上,当您尝试手动关闭它时,它会抛出一个异常,显示“closed”。我在使用这个重载,因为另一个说它用
ImageInputStream
包装,所以我想我应该节省一些工作将块更改为使用普通
FileInputStream
修复泄漏:在我看来,这似乎是JDK1.7中的一个bug,因为1.6在这里工作得很好
更新:我只是submitted a bug report向Oracle咨询这个问题
# 3 楼答案
我找到了另一个原因。ColorSpace的toRGB()方法似乎正在泄漏信号量。运行以下代码:
与:
会将您从系统文件中删除
编辑:已向Oracle提交了一份bug report