TomProbe的三大创新

 

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里的总内存线最后一直保持水平而不再爬升,可以认为网站研发得稳定而放心睡大觉了。