1

我在 Java 下运行的 Java 子进程的性能存在问题,在 FreeBSD 9.0-RELEASE i386 上运行。

System.exit(),对于这个程序,运行大约需要 2.6 秒。我不知道为什么。在 Windows 上需要 0.025 秒。更新:它在 OpenJDK 6 上也运行得更快。

在 ktrace 下运行 OpenJDK7 会在关闭期间显示以下大量序列:

26795 java 1.808597 CALL _umtx_op(0x2831e068,0xf,0,0,0xbf7a9870)
26795 java 1.838640 RET _umtx_op -1 errno 60 操作超时

我怎样才能弄清楚程序在这里试图做什么?或者,有没有简单的解决方法或方法来解决这个问题?从网络搜索来看,这个问题似乎经常出现在 FreeBSD 的操作系统级别,但我仍在分析我发现的内容(并尝试学习 libthr 等)。

除了打印时间戳之外,我没有添加任何关闭挂钩,系统没有添加关闭挂钩,没有要删除的文件,也没有 runFinalizersOnExit。系统似乎将时间花在了本地方法 java.lang.Shutdown.halt0 中,我仍在尝试分析。

4

1 回答 1

0

操作数 0xf 是 UMTX_OP_WAKE_PRIVATE(参见 参考资料/usr/src/sys/sys/umtx.h)。这试图唤醒内核线程,但失败了。

现在无法说它为什么会失败。这可能是java中的死锁。

于 2013-03-20T00:04:46.383 回答