【问题标题】:Java thread stopping for a whileJava 线程停止一段时间
【发布时间】:2020-07-31 21:18:28
【问题描述】:

我有以下问题。我有一个部署在 tomcat 服务器中的 Springboot Java 应用程序。我使用 SimpleAsyncTaskExecutor 和 @Scheduled 每 10 分钟运行一次任务。但有时执行会停止,并在一段时间后继续执行,有时 2 分钟,有时 10 分钟,有时它就不会继续执行。

我尝试增加 tomcat 的最大内存,但这没有用。我确定这不是一个未捕获的异常,所以我认为这可能是线程饥饿,但我该如何解决这个问题?

【问题讨论】:

  • 你能分享一些代码吗?

标签: java multithreading tomcat concurrency


【解决方案1】:

当执行被冻结时,您是否能够进行线程转储?他们展示了什么?为了调试这样的问题,我曾经以 5 到 10 秒的间隔进行 5 次线程转储,并使用一些线程转储分析器工具(如 https://fastthread.io/

【讨论】:

    【解决方案2】:

    如果是线程饥饿问题,那么您可以在方法声明中使用关键字synchronized,或者在有关键代码的地方创建synchronized{} 代码块。您也可以使用Lock 并使用Lock 提供的.lock() 和.unlock() 方法。

    注意 - 如果您使用的是 Lock,请将您的关键代码放在 try{} finally 块中,以便您始终释放内在锁。

    lock.lock();      //using lock 
            try {
                //execute critical section of the code.
            } finally {
                lock.unlock();//release the lock so other thread can use it.
            }
     
    

    【讨论】:

      【解决方案3】:

      可能会发生两件事:

      1. 您的线程正在等待监视器
      2. GC 正在进行 stop-the-world 收集。

      您可以使用 -xloggc 开关将 GC 日志添加到您的应用程序。这样您就可以更好地了解堆。

      您还可以在线程被锁定之前、之后和期间使用 jstack 或 kill -3 进行堆栈跟踪。您可以单独运行它并输出到文件。

      您还可以将 jconsole 连接到您的应用程序并检查您的堆和线程

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-25
        • 1970-01-01
        • 2011-10-23
        • 2021-11-22
        • 1970-01-01
        相关资源
        最近更新 更多