试图调试行为不端的Java VM.有问题的过程是在Centos 5上运行Sun VM 1.6u24的大型VM(100GB堆),它正在执行例行的后端工作 - 即数据库访问,文件I/O等.
重新启动进程以进行软件版本升级后,我们发现其吞吐量已显着下降.大多数时候,顶级报告称Java进程正在充分利用2个核心.在此期间,VM完全不负责任:没有写入日志,也没有响应外部工具,如jstack或kill -3.VM恢复后,该过程将按正常方式继续,直到下一次挂起.
strace显示在这些挂起期间,只有2个线程进行系统调用.这些是VM线程"VM线程"(21776)和"VM周期性任务线程"(21786).据推测,这两个线程耗尽了CPU时间.应用程序线程偶尔会唤醒并完成工作.其余的时间他们似乎在等待各种futexes.顺便提一下,正常阶段的第一行始终是SIGSEGV.
[pid 21776] sched_yield() = 0
[pid 21776] sched_yield() = 0
[pid 21776] sched_yield( <unfinished ...>
[pid 21786] <... futex resumed> ) = -1 ETIMEDOUT (Connection timed out)
[pid 21776] <... sched_yield resumed> ) = 0
[pid 21786] futex(0x2aabac71ef28, FUTEX_WAKE_PRIVATE, 1 <unfinished ...>
[pid 21776] sched_yield( <unfinished ...>
[pid 21786] <... futex resumed> ) = 0
[pid 21786] clock_gettime(CLOCK_MONOTONIC, {517080, 280918033}) = 0
[pid 21786] clock_gettime(CLOCK_REALTIME, {1369750039, 794028000}) = 0
[pid …Run Code Online (Sandbox Code Playgroud)