Jstack性能排查
现在的应用服务器还是很多的,但是问题排查和调优方式基本还是一样的,公司使用的是resin作为服务器容器,这篇文章记录今天下午对tomcat进行问题排查的基本步骤做个总结;
应用场景:
项目发生性能问题,比如某个功能慢,服务器cpu高,内存溢出,cpu高等均可以按以下方式进行排查
环境是: windows+tomcat+eclipse
准备一个简单项目,然后
-
项目打成war包部署到tomcat的webapps目录下;
-
Jvm 命令之打印堆栈线程信息;
-
Eclipse创建简单web项目
-
项目目录
-
-
编写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++; } } }
-
编写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(); } }
-
在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>
-
项目打成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的;