10

所以我正在使用 VisualVM 分析我的应用程序。

我遇到了一个关于我的 MySQL 交互的热点。我的第一个想法是热点显示我的应用程序在 IO 之后等待的时间。但是在分析报告中,VisualVM 有两列“时间”和“时间(cpu)”。也许这个词被错误地使用了,但我假设 self-time (cpu) 列不包括 IO 时间。经过更多调试,我们得出结论,假设是错误的并且显示 IO 时间,因为热点位于 MySQL 驱动程序的 java.net.SocketInputStream.read() 和其他不应该消耗任何 cpu 的 IO 东西上。

所以,我的问题是为什么 visualvm 将 SocketInputStream.read() 报告为 cpu 时间?

截图

4

3 回答 3

11

在监视线程活动时,本机调用始终处于 RUNNABLE 状态,这可能是因为 JVM 无法知道本机调用是在休眠还是实际在做某事。因此,在 RUNNABLE 状态下经过的时间算作 CPU 时间。

于 2012-06-08T13:18:59.137 回答
1

这个很长的线程声称小写入可能会导致问题。值得一读,但我不知道你能做些什么。你能做什么?您可以确保您没有使用小的fetch size。这不会给你小写,但小读会导致同样的问题。您可以为客户端或服务器尝试不同的平台。此错误中有一条评论如下:

“在 Solaris 和 Linux 之间填充 I/O 缓冲区的速度(以及对 ReadAheadInputStream.fill() 的调用次数)方面,我们已经看到了截然不同的行为,因为它读取可用的内容,除非需要,否则它不会阻塞阅读比可用的更多)。”

于 2012-06-02T20:29:57.460 回答
-1

SocketInputStream.read() 阻塞,直到另一端有可用数据。因此,您的数据库可能响应缓慢。

于 2012-06-02T13:44:17.470 回答