TomProbe与其它类似监测软件相比,有哪些重要的有价值的创新?主要有三:
一、引入了外来线程监测
网站开发,开发者最好不要在servlet或jsp里创建启动线程,因为这种线程的数量可能会随着浏览器用户访问的猛增而增加,当Tomcat里的线程数超过500时,Tomcat就会响应很慢甚至宕掉。
Tomcat10自带的Async1.java例子是这样的:
package async;
import java.io.IOException;
import jakarta.servlet.AsyncContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
public class Async1 extends HttpServlet{
private static final long serialVersionUID=1L;
private static final Log log=LogFactory.getLog(Async1.class);
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
final AsyncContext actx=req.startAsync();
actx.setTimeout(30*1000);
Runnable run=new Runnable(){
@Override
public void run(){
try{
String path="/jsp/async/async1.jsp";
Thread.currentThread().setName("Async1-Thread");
log.info("Putting AsyncThread to sleep");
Thread.sleep(2*1000);
log.info("Dispatching to "+path);
actx.dispatch(path);
}
catch (InterruptedException x){
log.error("Async1", x);
}
catch (IllegalStateException x){
log.error("Async1", x);
}
}
};
Thread t=new Thread(run);
t.start();
}
}
在service()方法里创建启动了线程,而且还sleep了2s,这扯淡了:2s内如果有2000个浏览器用户访问Async1这个Servlet,那么Tomcat里就有2000多个线程,Tomcat因线程调度而很慢很慢或直接用光内存而宕掉!
当您的网站里有这种因浏览器用户访问而临时创建启动的线程时,用TomProbe监测,就会看到外来线程这条线有“毛刺”出现,如下图所示:
当您看到TomProbe里的外来线程这条线有“毛刺”出现时,这不是好事,您的网站是不稳定的,将可能宕掉。这时,您应该检查在您的servlet或jsp程序里是否临时创建启动了线程,改正!不要那样做。
二、引入了线程CPU监测
通过Thread.currentThread().setName()设置代码标记,显示代码的CPU消耗情况,分析网站的CPU消耗是由哪些代码造成的。
特别地,采用TomProbe迅速定位解决“网站运行到一定阶段,突然出现CPU消耗99.9%,并且以后一直保持在高CPU状态”这种随机出现的幽灵一样的问题。这样的严重问题可能是几个月随机出现一次,在没有TomProbe的情况下,debug一次可能需要几个月时间,找到原因、最终解决可能需要几年时间!真的使人抓狂!但您必须解决它!
三、对内存监测的创新
对其它软件里司空见惯的内存监测,TomProbe的监测是不一样的:TomProbe监测的是总内存是否为水平线。即:TomProbe不怎么关心内存的绝对数据,而是关心总内存是否能稳定下来、不再增长。
Tomcat启动后,经过一段时间的运行,总内存不能稳定下来而是一直在台阶式地爬升(如下图所示),那么Tomcat迟早要用光内存而宕掉!
总内存一直在增长,正是Tomcat网站宕掉的最常见的情形!
想不通了是吧?Java不是自动回收内存吗,怎么会有内存泄漏?导致您的Tomcat网站的总内存一直在增长的原因还是不少的。
发单方看到TomProbe里的总内存线一直在台阶式爬升,可以认为网站不稳定而拒绝验收项目;开发方看到TomProbe里的总内存线最后一直保持水平而不再爬升,可以认为网站研发得稳定而放心睡大觉了。