jstack如何区分JVM级别线程和用户级别线程?
良好的线程命名习惯,有助于排查线程相关的问题。
对于jvm启动的线程,它都有良好的命名,我们使用jstack一看便知,这些线程的作用是什么。我们写一段简答的程序来验证一下:
这段代码里,没有创建任何用户线程,我们使用jstack命令,可以看看jvm都会启动哪些线程:
我们从线程信息第一列,就可以很清晰的看到,它们的作用是什么,如main方法入口线程,gc线程等等。
如果我们在工作中,需要使用新的线程或线程池来运行任务,那么一定要记得给线程清晰的命名,如果不个线程命名,系统会自动给它按序号命名,例如下面的代码:
通过jstack命令,我们可以到如下线程信息:
jvm给线程的命名是Thread-序号,我们不能直接从线程名称知道它的作用,如果我们给它进行了清晰的命名,在使用Jstack命令时,就可以根据名称来排查了。例如,我们给支付的后台任务线程,命名为Payment Task Thread 加上序号 ,这样就很清晰了。
推荐阅读: