java - 只要 ServerSocket 空闲,Linux 上的 Tomcat6 就会使用 100% 的 CPU

标签 java load cpu tomcat6 serversocket

问候

我在 Ubuntu8.04 上的 Java6 上的 Tomcat6 上运行我的 webapp。 这个应用程序的主要 servlet 使用以下简单代码打开一个 ServerSocket:

ServerSocket serverSocket = new ServerSocket(6767);

Socket xmlSocket = serverSocket.accept();        

当然,这在一个单独的线程中运行,并带有必要的 try-catch block 。

当我启动 Tomcat 时,它立即达到 100% 的 CPU 负载并一直保持到客户端连接到端口 6767。只要客户端连接,负载就会下降到 0%。一旦客户端断开连接,负载就会恢复到 100%。

谁能告诉我这是关于什么的?

谢谢!

解决方案:

下面的两个答案都非常有帮助。该问题实际上与 ServerSocket 无关,而是与应用程序完全不同的线程中的不眠 while 循环有关,而且还取决于客户端是否已连接。

我能够使用 JDK 命令“jstack”识别 Activity 线程,然后很容易找到带有失控循环的线程。

感谢您的帮助! :)

最佳答案

也许找出正在发生的事情的最简单方法是等待它以 100% 运行,然后通过 Ctrl-Break(或使用 SendSignal 或类似方式)生成线程转储.您将获得一组线程及其状态,应该清楚哪个正在运行,以及它在代码中的位置。

关于java - 只要 ServerSocket 空闲,Linux 上的 Tomcat6 就会使用 100% 的 CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2351036/

相关文章:

java - 用于启动 Java 应用程序的微型 exe

android - 加载器 jquery 动画在 webview android 上不起作用

jquery - 如何在 jQuery 中使用变量加载页面

haskell - Prelude(Haskell)加载模块后如何退出 "Main"状态?

multithreading - 理解lscpu的输出

Java 正则表达式 - 这段代码有什么问题

java - 如何为elasticsearch中的单个字段分配恒定的提升值?

java - 是否可以从 JavaSE 应用程序无缝连接到 000webhost.com 上托管的 MySQL 数据库?

java - 循环内部/外部使用 'Runtime.getRuntime()'

assembly - Z80 汇编程序/机器代码中的字节/字/地址是有符号的还是无符号的?