【问题标题】:VisualVM socket.readVisualVM socket.read
【发布时间】:2012-06-07 09:56:14
【问题描述】:

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

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

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

【问题讨论】:

  • 可能有一些忙等待,例如在循环中调用available()
  • 对不起我的错误。它在 java.net.SocketInputStream.read()

标签: java profiling visualvm


【解决方案1】:

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

【讨论】:

  • 谢谢!这正是我想要的。
【解决方案2】:

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

“我们已经看到大量不同的行为,即在 Solaris 和 Linux 之间填充 I/O 缓冲区的速度(以及调用 ReadAheadInputStream.fill() 的次数,因为它会读取可用的内容,它不会阻塞,除非它需要读取的内容超出可用内容)。”

【讨论】:

  • 谢谢,这很有见地,但这不是我想要的答案:(
【解决方案3】:

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

【讨论】:

  • 我知道。那不是我的问题。我的问题是为什么 visual vm 将其标记为 cpu 使用情况?
猜你喜欢
  • 2013-02-24
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多