账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Spring应用启动hang住了,如何快速确定是哪个线程导致hang的呢?
    77
    0

    请教个问题:如果你刚接手了一个陌生Spring应用,应用在启动的过程中hang住了,Spring容器并没有启动完成也没有失败就一直hang在那里。业务日志中并没有明显的错误日志(可以确定是外部依赖导致的),更多是一些中间件系统的正常日志,那要如何定位是什么导致启动失败呢?

    我的尝试:1.通过日志企图找到蛛丝马迹(搜寻了基本日志没有发现明显错误) 2.多次thread dump企图看是否有明显死锁、阻塞线程问题(失败) 3、继续thread dump企图找到导致hang的原因
    我的经验:长时间hang可能是需要下载某些东西,但一直下载不下来(可能是网络、内存等原因);外部依赖没有超时熔断而是一直在重试。。。。

    我的疑问:在第三个尝试中,由于在一个复杂的系统中会依赖各种各样的中间件等外部系统,spring容器已经加载了一部分的bean,这样thread dump中会有各种各样的线程处于不同的状态,那一个新系统如何快速确定是哪个线程导致hang的呢?当然经验很足或者对系统很熟悉可能更快。

    当然很多人的答案都是具体情况具体分析,但你哪些经验可以分享呢?

    1
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 我家g港有船 普通会员 1楼

      在Spring应用启动时,如果出现hang的情况,你可以通过以下几种方法来快速确定是哪个线程导致的:

      1. 使用JVM的日志信息:Java虚拟机(JVM)提供了详细的日志信息,可以帮助你了解在启动应用程序时遇到的问题。你可以在类加载器的类加载阶段记录启动日志,然后在应用程序运行时使用这些日志信息来定位问题。

      2. 使用线程池管理工具:Spring的ThreadPoolTaskExecutor可以提供线程池管理功能,你可以在应用程序启动时设置线程池的大小和任务调度策略,然后在应用程序运行时检查线程池的状态。如果线程池中存在未完成的任务,说明可能是某个线程的阻塞导致的hang。

      3. 使用JVM的死锁检测机制:JVM提供了死锁检测机制,可以帮助你找出导致hang的线程。你可以在应用程序启动时检查线程池的状态,然后在应用程序运行时检查线程池中的任务是否出现死锁。

      4. 使用Java的性能分析工具:一些性能分析工具(如VisualVM、JProfiler)可以提供详细的性能分析信息,包括CPU、内存、线程等的使用情况,可以帮助你找出可能导致hang的线程。

      5. 使用Spring的应用上下文管理器:Spring应用上下文管理器(如ApplicationContext)提供了对应用程序上下文的访问和管理功能,你可以在应用程序启动时设置应用上下文的配置,然后在应用程序运行时检查应用上下文的状态,如果存在未完成的任务,说明可能是某个应用上下文的阻塞导致的hang。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部