【发布时间】:2013-05-22 07:39:34
【问题描述】:
我查看了关于 SO 的其他类似问题,但它们似乎是由其他问题引起的。
首先我确保我明智地关闭了所有文件句柄,然后我使用lsof -p <pid of java> 查看我的文件列表。
它在我的整个运行过程中保持不变,但我会定期在lsof 中列出大约 10,000 个条目,如下所示:
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)
更新:在 JDK 1.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)
JDK 1.7 有何不同?
【问题讨论】:
-
我会尝试使用常规的 Java 分析器,例如 YourTrack 甚至只是 VisualVM,看看您是否可以将 10K 信号量的创建与大量 Java 库对象的创建关联起来。
-
我仍然看到这个问题,但我没有使用 ImageIO(至少不是直接使用)。重绘只会导致信号量的数量增加,直到我得到:2012-05-09 16:30:12.856 java[14407:3d87] Persistent UI failed to open file file://localhost/Users/juancn/Library/Saved %20Application%20State/net.java.openjdk.cmd.savedState/window_1.data:打开的文件太多(24)