Jstack性能排查

​ 现在的应用服务器还是很多的,但是问题排查和调优方式基本还是一样的,公司使用的是resin作为服务器容器,这篇文章记录今天下午对tomcat进行问题排查的基本步骤做个总结;

​ 应用场景:

​ 项目发生性能问题,比如某个功能慢,服务器cpu高,内存溢出,cpu高等均可以按以下方式进行排查

​ 环境是: windows+tomcat+eclipse

准备一个简单项目,然后

  1. 项目打成war包部署到tomcat的webapps目录下;

  2. Jvm 命令之打印堆栈线程信息;

  • Eclipse创建简单web项目

    1. 项目目录

      在这里插入图片描述

  1. 编写User类

    ​ User类主要关注是里面的 三个方法 doSomeThings()

    ​ 该方法里面是死循环;

    package com.wufeng.entity;
    
    public class User {
    
    	private String id;
    	private String name;
    	private String age;
    	public String getId() {
    		return id;
    	}
    	public void setId(String id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getAge() {
    		return age;
    	}
    	public void setAge(String age) {
    		this.age = age;
    	}
    	@Override
    	public String toString() {
    		return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
    	}
    	//死循环
    	public void  doSomeThings(){
    		
    		int i=0;
    		while(true){
    			i++;
    		}
    	}
    	
    	
    	public void  doSomeThings1(){
    		
    		int i=0;
    		while(true){
    			i++;
    		}
    	}
    	
    	public void  doSomeThings2(){
    		
    		int i=0;
    		while(true){
    			i++;
    		}
    	}
    	
    	
    }
    
    
    1. 编写HelloServlet类

      访问/hello,执行里面的doGet方法

      package com.wufeng.servlet;
      
      import java.io.IOException;
      
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      
      import com.wufeng.entity.User;
      
      @WebServlet("/hello")
      public class HelloServlet extends HttpServlet {
      
      	@Override
      	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      		// TODO Auto-generated method stub
      		doPut(req,resp);
      	}
      
      	@Override
      	protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      		// TODO Auto-generated method stub
      		System.out.print("------------------------------------");
      		
      		User user = new User();
      		user.doSomeThings1();
      	
      	}
      	
      }
      
      
    2. 在WebContent目录下创建 jsp1/jsp2/jspTest.jsp

      里面主要是引入了User类,执行user.doSomeThings2();死循环

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <%@ page import="com.wufeng.entity.User" %>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>jspTest页面</title>
    </head>
    <body>
    开始执行
    <%
      User user = new User();
      user.doSomeThings2();
    %>
    执行完毕
    </body>
    </html>
    
    1. 项目打成war包到tomcat的webapps目录下;

      在这里插入图片描述

​ 到此项目创建完毕;

  • 运行tomcat/bin/start.bat

  • 浏览器访问http://localhost:8080/tomcatDemo/hello

在这里插入图片描述

  • 获取tomcat pid
    在这里插入图片描述

    ​ 此处是通过端口来获取tomcat的pid;

    当然也可以进入jdk/bin目录执行jps命令也可以知晓tomcat运行时的pid;
    在这里插入图片描述

  • 根据pid打印jvm线程信息;

    进入jdk/bin目录,执行 jstack 5972 >> 1.txt

    生成的线程信息将会打印到1.txt. 该文件路径在当前路径下,即bin目录下

在这里插入图片描述

  • 查看线程信息,排查

    notepad++打开该文件;

    搜索关键字hello;便能看到线程栈了;正在执行User.doSomeThings

在这里插入图片描述

​ 以上请求是访问http://localhost:8080/tomcatDemo/hello

​ 以下请求是访问http://localhost:8080/tomcatDemo1/jsp1/jsp2/jspTest.jsp

在这里插入图片描述

从标红位置也是分析出请求的Url的;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值