我们在 Solaris 10 Zone 上运行的 JAVA 程序运行缓慢。我truss
在 pid 上运行了一个程序,发现即使程序没有执行任何操作,也会生成以下消息:
pollsys(0x00000000, 0, 0xFFFFFFFE14DFEEC0, 0x00000000) = 0^M
/51: timeout: 0.010000000 sec^M
/51: pollsys(0x00000000, 0, 0xFFFFFFFE14DFEEC0, 0x00000000) = 0^M
/51: timeout: 0.010000000 sec^M
/29: pollsys(0x00000000, 0, 0xFFFFFFFE242FF970, 0x00000000) = 0^M
/29: timeout: 0.050000000 sec^M
/51: pollsys(0x00000000, 0, 0xFFFFFFFE14DFEEC0, 0x00000000) = 0^M
/51: timeout: 0.010000000 sec^M
/51: pollsys(0x00000000, 0, 0xFFFFFFFE14DFEEC0, 0x00000000) = 0^M
/51: timeout: 0.010000000 sec^M
/51: pollsys(0x00000000, 0, 0xFFFFFFFE14DFEEC0, 0x00000000) = 0^M
/51: timeout: 0.010000000 sec^M
/29: pollsys(0x00000000, 0, 0xFFFFFFFE242FF970, 0x00000000) = 0^M
/29: timeout: 0.050000000 sec^M
/22: lwp_cond_wait(0x101585840, 0x101585828, 0xFFFFFFFE250FE960, 0) Err#62 ETIME^M
/63: pollsys(0xFFFFFFFE135FE458, 1, 0xFFFFFFFE135FE380, 0x00000000) = 0^M
/63: fd=46 ev=POLLIN rev=0^M
/63: timeout: 0.100000000 sec^M
其前面/后面还有:
lwp_mutex_timedlock(0xFFFFFFFF7EAF2AE0, 0x00000000) = 0^M
/62: pollsys(0xFFFFFFFE137FE4D8, 1, 0xFFFFFFFE137FE400, 0x00000000) = 0^M
/62: fd=32 ev=POLLIN rev=0^M
/62: timeout: 0.100000000 sec^M
/63: lwp_mutex_wakeup(0xFFFFFFFF7EAF2AE0, 0) = 0^M
/51: pollsys(0x00000000, 0, 0xFFFFFFFE14DFEEC0, 0x00000000) = 0^M
/51: timeout: 0.010000000 sec^M
/37: lwp_mutex_timedlock(0xFFFFFFFF7EAF2AE0, 0x00000000) = 0^M
/37: lwp_mutex_wakeup(0xFFFFFFFF7EAF2AE0, 0) = 0^M
/61: lwp_mutex_timedlock(0xFFFFFFFF7EAF2AE0, 0x00000000) = 0^M
我们知道这可能意味着什么吗?有没有办法对此进行更多了解?我读到我们可以运行dtrace
,但是我们是否可以运行其他实用程序来了解缓慢发生的位置。该应用程序需要花费大量时间来运行基本查询,而在 Windows 服务器上运行则要顺畅得多。
答案1
最好的办法是使用 Java 调试器,查看 JVM 线程正在做什么。从系统调用跟踪中很难判断发生了什么。
答案2
您正在查看 JVM 操作互斥锁 (锁)。等待锁可能会导致线程闲置,不会占用太多 CPU 时间,但不会取得任何进展 (!)
--戴夫