【问题标题】:Unknown Thread pools being created正在创建的未知线程池
【发布时间】:2019-02-03 19:50:58
【问题描述】:

我们有带有多个库作为依赖项的 Spring Boot 微服务。例如 Jest(弹性搜索)、Hikari、Spring-Rabbit、FasterXml 等等。

在分析线程转储后,我们发现正在创建 2 个未知池。在正常的开发机器上,这些池包含 8 到 10 个线程。但是在 prod 环境中,我们观察到每个池有 66 个线程。线程池名称是自动生成的,如 pool-7、pool-2 等。

我们想找出哪个 java 类/库正在创建这个线程池并产生线程。尝试使用 oracle 飞行记录器,但即使在那里我们也看不到这些线程的来源。

有人可以建议找出谁在创建这些线程的方法吗?

谢谢, 思密达

【问题讨论】:

    标签: spring-boot threadpool jestjs spring-boot-actuator


    【解决方案1】:

    很遗憾,Flight Recorder 中的 Threat Start 事件没有记录来自 Thread#start 方法的堆栈跟踪。我会看看它是否可以添加到未来的 JDK 版本中。但是,您应该能够看到启动新线程的线程。

    如果您找不到其他工具来帮助您,我能想到的唯一方法是自己检测 java.lang.Thread#start 方法。使用字节码检测,或者只是克隆 OpenJDK,修改 java.lang.Thread 的源文件并构建您自己的自定义 JDK。最后一步可能听起来令人生畏,但如果您使用的是 JDK 8 或更高版本,这并不难。

    hg clone http://hg.openjdk.java.net/jdk8/jdk8
    cd jdk8
    bash get_source.sh
    bash configure
    make images
    

    当您克隆时,根目录中有一个 README 文件,如果您遇到问题,该文件将指向您进一步的说明。

    【讨论】:

    • 谢谢。这很有帮助。但截至目前,我在日志中打印了我的线程名称,并启用了调试日志。带有线程 ID 的日志有助于找到罪魁祸首。
    猜你喜欢
    • 2020-03-05
    • 2023-02-02
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 2020-01-06
    • 2015-03-28
    • 2016-05-21
    • 2012-06-06
    相关资源
    最近更新 更多