我在Tomcat中运行了一个Java应用程序(1.8)。应用程序记录到一个日志文件,包括线程ID: 06/30 11: 30 :51 (101970) userInfo Jun 30:30:51 CEST 2022 INFO some.class.name [] -一些日志消息
最近我注意到线程Id变得非常大(1600000 +),我想知道这是否表明线程池(即线程没有返回到池)出现了问题。
根据Thread类,ID应该是一个正在增加的唯一数字(并且可能被重用)。我认为这意味着只有在必须创建新的额外线程时,ID才会增加。
不过,我目前正在监视线程计数(通过ThreadMXBean),并发现线程id号远远高于峰值线程计数。
是否有人了解线程id是如何创建的,以及高线程id与线程数量之间是否有关联?
发布于 2022-06-30 10:36:52
在java.lang.Thread中,我们看到以下非常简单的小代码:
/* For generating thread ID */
private static long threadSeqNumber;
private static synchronized long nextThreadID() {
return ++threadSeqNumber;
}这意味着,每次创建一个新线程时,都会发出一个新id,而不管以前创建的线程是否已经终止。这意味着线程id将永远不会被重用,我推测线程id是long,唯一的目的是保证线程id永远不会用完。
现在,线程池以及JVM的其他功能一直在创建和销毁线程。例如,如果一个线程池已经有一段时间没有使用它的一个线程,它可能会销毁该线程,并在稍后发现它有用途时重新创建它。
这意味着当您的软件持续运行数小时时,您将不可避免地看到越来越高的线程ids。这很正常。
https://stackoverflow.com/questions/72813697
复制相似问题