linux下tomcat shutdown后 java进程依旧存在 -- 阿里MetaQ篇

此篇文章描述的症状和上一篇文章一致(即执行tomcat ./shutdown.sh 后,虽然tomcat服务不能正常访问了,但是ps -ef | grep java 后,发现tomcat对应的java进程未随web容器关闭而销毁,进而存在僵尸java进程),但是处理的过程不一致,所有又单开了一篇blog来写。

我在另外一个项目中使用到了阿里的MetaQ消息中间件,然后shutdown tomcat 发现java进程依旧存在,沿用上一篇文章的思路,我最开始以为是本地代码中scheduledExecutorService没有及时关闭,但check code后发现scheduledExecutorService
已经进行了shutdown处理。于是只能从jstack dump跟踪,./jps   查询到对应的pid,然后 ./jstack  pid,发现存在如下一个非守护线程的dump:

"notify-remoting-ScanAllConnection-1-thread-1" prio=10 tid=0x00007f6124956000 nid=0x2cda waiting on condition [0x00007f6149544000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000000f04a5958> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2082)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1090)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:807)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1043)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1103)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:722)

上述dump对应的代码是Gecko中,com.taobao.gecko.service.impl.BaseRemotingController类,发现此类中存在一个ScheduledExecutorService scanAllConnectionExecutor,然后我窃以为是此处未shutdown,但,非也,阿里coder的代码不会出现如此低劣的漏洞的,遵循问题定位原则:出现bug时先确保不是自己的代码出现问题,我又看了一遍项目中涉及到metaq的代码,惊奇的发现,虽然一再强调MessageSessionFactory、MessageProducer、MessageConsumer
应该是单例复用形式存在,项目中我是采用spring来托管singleton的,然后,在创建MessageProducer时,却没有使用已经singleton的MessageSessionFactory,而是又重新new
出一个 MessageSessionFactory 实例,而且shutdown时只shutdown spring托管的实例,重新new 出来的对象并未对其进行shutdown。正是该原因,导致Gecko中的scanAllConnectionExecutor一直处于timed_waiting
状态,进而导致jvm无法正常退出。

此次bug定位耗时近一天,最开始我甚至以为是Gecko的bug,但事实证明,出问题往往是自己!引此为戒 :)

linux下tomcat shutdown后 java进程依旧存在 -- 阿里MetaQ篇

时间: 2024-11-06 16:58:43

linux下tomcat shutdown后 java进程依旧存在 -- 阿里MetaQ篇的相关文章

linux下tomcat shutdown后 java进程依旧存在

今天遇到一个很奇怪的问题,如标题所示: linux下(之所以强调linux下,是因为在windows下正常),执行tomcat ./shutdown.sh 后,虽然tomcat服务不能正常访问了,但是ps -ef | grep java 后,发现tomcat对应的java进程未随web容器关闭而销毁,进而存在僵尸java进程. 刚开始百思不得其解,google下,发现存在一种说法是:有非守护线程存在,jvm不会退出.进而确认是因为项目代码存在 scheduledExecutorService.s

linux下Tomcat shutdown无效

问题: linux下关闭tomcat后,发现重启Tomcat后,端口号提示被占用, 原因: 这时可能是项目中的后台线程或者socket依然在运行把端口号占用, 解决办法: ①:可以输入命令:$netstat -pan|grep 2809 查看这个端口号的情况, 可以netstat -anp |grep 3306 找出这个端口号,再kill当前的PID进程 ②:通过iptables工具将该端口禁掉 iptables -A INPUT -p tcp --dport 111 -j DROP ③:关闭端

Linux下Tomcat端口号以及进程

 Linux下Tomcat端口号以及进程 1,查看tomcat进程: ps -aux | grep tomcat(或者ps -ef | grep tomcat都行) 可以看到现在运行着两个tomcat进程,一个进程的pid为9974,另一个pid为23422.  2,根据进程查看端口号: sudo netstat -naop | grep 23422 这是查看pid为23422的进程占用的端口号: 可以看到9300和9399端口号被占用,其中9399是tomact Server的SHUTDOWN

Linux下Tomcat启动后显示控制台

Linux下Tomcat启动后显示控制台: 采用 ./startup.sh 启动,则没有显示控制台. 要像windows一样显示控制台,则 : ./catalina.sh run

linux下如何批量杀JAVA进程或某个进程方法

在工作中经常需要停止JAVA进程,停止时间也比较长,那么有时候因为一些情况,需要把 linux 下JAVA所有进程 kill 掉,又不能用killall 直接杀掉某一进程名称包含的所有运行中进程(我们可能只需要杀掉其中的某一类或运行指定参数命令的进程),这个时候我们需要运用ps, grep, cut 和 kill 一起操作. ok,下面给出具体的参考: ps -ef|grep LOCAL=NO|grep -v grep|cut -c 9-15|xargs kill -9 运行这条命令将会杀掉所有

Linux 下Tomcat的启动、关闭、杀死进程

Linux下Tomcat的启动.关闭.杀死进程 打开终端 cd /java/tomcat #执行 bin/startup.sh #启动tomcat bin/shutdown.sh #停止tomcat tail -f logs/catalina.out #看tomcat的控制台输出: #看是否已经有tomcat在运行了 ps -ef |grep tomcat #如果有,用kill; kill -9 pid #pid 为相应的进程号 例如 pe -ef |grep tomcat 输出如下 sun 5

Linux下tomcat服务

一:Linux下tomcat服务的启动.关闭与错误跟踪,使用PuTTy远程连接到服务器以后,通常通过以下几种方式启动关闭tomcat服务:切换到tomcat主目录下的bin目录(cd usr/local/tomcat/bin)1,启动tomcat服务方式一:直接启动 ./startup.sh方式二:作为服务启动 nohup ./startup.sh &方式三:控制台动态输出方式启动 ./catalina.sh run 动态地显示tomcat后台的控制台输出信息,Ctrl+C后退出并关闭服务解释:

Linux下Tomcat的启动、关闭

在Linux系统下,启动和关闭Tomcat使用命令操作. 进入Tomcat下的bin目录 cd /java/tomcat/bin 启动Tomcat命令 ./startup.sh 停止Tomcat服务命令 ./shutdown.sh 执行tomcat ./shutdown.sh 后,虽然tomcat服务不能正常访问了,但是ps -ef | grep java 后,发现tomcat对应的java进程未随web容器关闭而销毁,进而存在僵尸java进程.网上看了下导致僵尸进程的原因可能是有非守护线程(即

linux下tomcat服务器的相关命令

一:Linux下tomcat服务的启动.关闭与错误跟踪,使用PuTTy远程连接到服务器以后,通常通过以下几种方式启动关闭tomcat服务:切换到tomcat主目录下的bin目录(cd usr/local/tomcat/bin)1,启动tomcat服务方式一:直接启动 ./startup.sh方式二:作为服务启动 nohup ./startup.sh &方式三:控制台动态输出方式启动 ./catalina.sh run 动态地显示tomcat后台的控制台输出信息,Ctrl+C后退出并关闭服务解释: