所以我正在用VisualVM分析我的应用程序。
我遇到了一个关于我的MySQL交互的热点。我的第一个想法是,热点显示我的应用程序在IO之后等待的时间。但是在性能分析报告中,VisualVM有两列“时间”和“时间(cpu)”。也许这个术语用错了,但我认为self-time (cpu)列不包括IO时间。经过更多的调试,我们得出的结论是,这个假设是错误的,并且显示了IO时间,因为热点位于MySQL驱动程序的java.net.SocketInputStream.read()上,以及其他不应该占用任何cpu的IO内容。
那么,我的问题是,为什么visualvm报告SocketInputStream.read()作为cpu时间?

发布于 2012-06-08 21:18:59
在监视线程活动时,本机调用始终处于RUNNABLE状态,这可能是因为JVM无法知道本机调用是否处于休眠状态或正在执行某些操作。因此,在RUNNABLE状态中经过的时间将计入CPU时间。
发布于 2012-06-03 04:29:57
This very long thread声称,小写操作可能是导致问题的原因。这本书值得一读,但我不知道你能做些什么。你能做什么呢?您可以确保您使用的不是小型fetch size。这不会给你带来小的写操作,但是小的读操作会导致同样的问题。您可以为客户端或服务器尝试不同的平台。this bug中有一条评论是这样写的:
“我们已经看到在Solaris和Linux之间填充I/O缓冲区的速度有很大的不同(因此调用ReadAheadInputStream.fill()的次数也不同,因为它读取可用的内容,除非需要读取的内容超过可用内容,否则不会阻塞)。”
发布于 2012-06-02 21:44:17
SocketInputStream.read()阻塞,直到有来自另一端的数据可用。因此,这可能是数据库的响应速度较慢。
https://stackoverflow.com/questions/10862464
复制相似问题