java - Java+JDBC的CPU使用率

标签 java multithreading operating-system

在负载下测试我的 webapp 时,我在 Linux 下得到了以下 top 摘录:

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
3964 nobody    20   0 4965m 622m 6048 S  8.5 11.0   6:02.49 java 
1985 mysql     20   0  294m 125m 3804 S  2.1  2.2   0:05.39 /usr/sbin/mysqld

我需要有关 java 的 %CPU 列的解释。据我了解,在 Web 请求期间,java 的线程之一正在执行一些纯 Java 逻辑,消耗了一些 CPU 时间(假设为 5 毫秒)。然后它通过 JDBC 连接到数据库,发送一些 sql 查询并等待响应,比如说 10ms。这10ms显然算作/usr/sbin/mysqld CPU使用率。然后 java 线程恢复其操作并完成,又消耗了 20 毫秒,总计执行时间为 5+10+20=30 毫秒。

新手问题是:你不认为这些与数据库相关的 10ms 被计算了两次:一次是 java 线程等待数据库处理查询,第二次是数据库 CPU 使用率本身?我在这里有什么不明白?

最佳答案

当一个进程只是在等待一个套接字时,它通常不会使用大量的 CPU。基本上,内核知道它处于等待状态并且不会安排它运行 - 除了信号处理之类的小事情,可以使用例如定期运行垃圾收集器。

(好吧,如果有很多垃圾要收集,那“小东西”可能就不会那么少了。)

关于java - Java+JDBC的CPU使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5626468/

相关文章:

java.lang.IllegalArgumentException : Could not resolve property name hourtoreserve from Property set for bean com. ti.project.vaadin.vaadinprojectti.Day

java - JOptionPane 调用堆栈

java - Log4J - 在调用 LogManager.getLogger() 时显式指定类名是否有意义?

c - 使用互斥锁使线程退出是不好的做法吗?

c - 十六进制无法在自制的 printf() 函数中正确打印

c++ - 如何在 C++ 中与可执行文件交互

java - 生成 -1 和 1 之间的随机 float 会产生 NaN

c - 用于异步线程的 pthread_join()

java - 是否有可能在 4 核 Android 设备中高效地实现并行数学计算? (这个与接口(interface)无关)

windows - 了解 Windows 中正在运行的进程的布局(段)的任何工具?