Java 线程在 Linux 中进入 hibernate 状态

标签 java linux multithreading threadpool

我正在编写类似于“守护进程”的软件,它使用多线程在循环中做一些事情(登录到某个地方,做一些事情然后注销)。 我的应用程序运行大约 1000-2000 个线程,这个线程可以正常工作。 所以这是我最初 ~10 分钟的 htop 日志: Before

因此您可以在上面的屏幕截图中看到一些线程正在运行(按绿色 R 状态排序)

但一段时间后会发生这种情况: After

如您所见,只有一三个线程在周期性运行(看起来系统会减慢线程速度或使其 hibernate )。 应用程序为小型作业运行线程(大约 10 秒到 1 分钟),线程死后,固定线程池执行器创建新线程来完成相同的工作。 因此,据我了解,线程执行的速度应该始终相同。但它在约 10-20 分钟后变慢。通常在 htop 中每次运行最多 ~500-200-300-100 个线程和最多 ~3-30-60 个线程。但是在这 10-20 分钟之后,只有线程在执行。那么您能告诉我发生了什么以及如何解决这个问题吗?

最佳答案

线程是否正在访问mysql?我看到它以 100% 的速度运行......如果一个线程正在等待 I/O,内核会让它 hibernate 直到数据准备好。如果它在磁盘上等待,您可能会看到它反射(reflect)在平均负载中,因此它可能正在等待网络数据(您的套接字等是否正确关闭?您是否被远程连接到的任何服务器阻止?是您的远程服务挂了?)或者mysql的数据(是不是你的连接池太小了?是mysql的负载不够了吗?)。

关于Java 线程在 Linux 中进入 hibernate 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8752086/

相关文章:

java - 如何在 java 中使用由 openssl 生成的 .key 和 .crt 文件?

java - JSONObject 有嵌套键

java - 安卓xmpp库

linux - 脚本 linux mongodb 错误 SyntaxError : Unexpected [

c# - 每x秒同时启动几个功能吗?

c - 使用线程计算文件中单词出现次数的程序中的段错误

java - 线程安全并发使用,多个实例?

java - GWT-EXT:Component.setId 生成随机前缀

linux - 将多个文件合并到一个 tar 文件中

linux - 从 elf 文件中的地址执行函数