VisualVM socket.read

时间:2012-06-02 12:53:48

标签: java profiling visualvm

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

我点击了关于我的MySQL互动的热点。我的第一个想法是热点显示我的应用程序在IO之后等待的时间。但在分析报告中,VisualVM有两列“Time”和“Time(cpu)”。也许这个术语被错误地使用了,但我假设自我时间(cpu)列不包括IO时间。经过更多的调试,我们得出结论,假设是错误的,并且显示了IO时间,因为热点是在MySQL驱动程序的java.net.SocketInputStream.read()和其他不需要花费任何cpu的IO事情上。

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

Screnshot

3 个答案:

答案 0 :(得分:6)

本机调用在监视线程活动时始终处于RUNNABLE状态,可能是因为JVM无法知道本机调用是在休眠还是实际正在执行某些操作。 因此,在RUNNABLE状态下传递的时间计为CPU时间。

答案 1 :(得分:1)

This very long thread声称小写可能导致问题。值得一读,但我不知道你能做些什么。你能做什么?您可以确保没有使用小fetch size。这不会给你小写,但小读取会导致同样的问题。您可以为客户端或服务器尝试不同的平台。 this bug中的评论内容为:

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

答案 2 :(得分:0)

SocketInputStream.read()会阻塞,直到另一方可以获得数据。所以它可能是您数据库的慢响应。