java线程监控

最近发现linux上部署的项目,启动了很多进程;记录一下排查的过程:

 疑问: why?很多进程,java不是启动只会启动一个进程吗?

排查命令ps aux|grep java 看到项目中确实只有一个进程在用;怎么会有很多线程呢;   其实,可以使用ps -eLf|grep   启动的包名|wc -l   ,发现确实有很多的进程;怎么会有这么多进程,一个常规的springBOOT项目在空载的情况下,竟然有500+(正常:100+左右)个进程在跑;并且也不是什么进程,应该是线程才对;这是怎么回事,其实原来也看过jvm模型;在Windows和linux实现的线程方式是不一样的,在windows下使用的确实线程的模式(thread),线程确实是在进程下面;而linux使用的线程是一个轻量级的进程;ps -mp PID  使用这个命令可以查看该进程下的线程数量;这样你会发现 和ps -eLf|grep   启动的包名|wc -l    统计出来的进程数是一样的;所以不难看出linux下的线程和进程没有什么太大的区别(A java application is never single threaded (Garbage Collector thread among other). So you always end up with several thread. Moreover, Linux implement thread as Light-weight process therefore, each Java thread will appear as a process with a unique PID in htop.)。但是,你的线程数为什么那么多呢?这就需要用java的监控工具去解决了,首先,使用jmap -dump:live;format =b;file=dump.bin pid 将内存数据导出;之后可以使用java自带的工具jhot去分析;我用的jprofiler去分析,并未发现有异常的线程(deadThread);那是什么原因?当看具体线程时,发现有quartz-scheduler这是什么线程,定时我这里不需要啊;之后发现开始撘项目时,一个同事用的另一个项目组的项目,直接拷贝过来的;也怪自己当时没有注意,现在才发现;之后又发现了一些Hadoop的客户端,what fuck,什么玩意,还有Hadoop的东西,大数据的东西一般都伴随着高并发;去掉之后,发到linux上继续观察;发现项目的线程数下降到100+,这样基本上正常了。

总结:

     项目的搭建过程不能,简单的能运行就可以,要做到需要那些组件应用那些组件,尤其是客户端类的东西,即使是你的业务系统中没有使用该包中的类,他有可能自动启动一些线程去做一些事情;搭建项目需要认真排查,需要什么引用什么包;尤其现在springBoot的项目更要注意。

原文地址:https://www.cnblogs.com/lyd96321/p/15747861.html