问题现象
Java进程存在,Servlet服务存在,cpu使用率低,未发现死锁。重启服务器,问题得到解决。
问题分析
根据tomcat的解压部署方式,发现jetty中设置为:-Djava.io.tmpdir=/tmp , 根据返回的错误搜索/tmp jetty,发现linux存在watchdong自动清理tmp目录。
[root@updata jetty]# cat /etc/cron.daily/tmpwatch
#! /bin/sh
flags=-umc
/usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \
-x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \
-X '/tmp/hsperfdata_*' 10d /tmp
/usr/sbin/tmpwatch "$flags" 30d /var/tmp
for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
if [ -d "$d" ]; then
/usr/sbin/tmpwatch "$flags" -f 30d "$d"
fi
done
系统默认每10天清理一次/tmp目录。
Spring会在系统启动加载类到内存中,但是不会加载servlet的相关内容。查看jetty的文档,Temporary Directories 有如下说明:
【本段文字为翻译】Jetty 本身没有临时目录,每个应用在war解压的时候指定temp目录,JSPs在运行是编译。
确定一个应用临时目录的算法如下:
1:尝试使用这个应用明确指定的目录:
2:基于全局设置创建一个目录。这个目录中在war解压后产生的目录是这样的: "Jetty_"host""port""context""+virtualhost
一个重要的提示:webapp的临时目录只能在它停止的时候删除里面的内容。
一旦临时目录被分配,它将作为一个web应用的javax.servlet.context.tempdir的文件实例被设置和检索。
解决问题的方法:
方法1:在jetty.home目录下面创建一个可写的文件夹work,去掉davinci.sh中的-Djava.io.tmpdir=/tmp 设置。
方法2:修改davinci.sh中的-Djava.io.tmpdir=/tmp为-Djava.io.tmpdir=指定的目录 ,然后在davinci.sh的stop函数中设置删除该目录中的内容。重要提示:每个应用设置的目录不能相同