ThreadMXBean定位CPU占用过高JSP

本文介绍了一个用于监控Java应用程序线程状态的JSP页面实现。该页面能够展示节点名称、线程CPU时间,并提供线程的总体概览,包括创建线程总数、活动线程数等关键指标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用该JSP页面即可打印出虚拟机当前进程所执行的代码,该代码来自新浪云。
<%@page import="java.util.ArrayList"%>
<%@page import="java.lang.management.ThreadInfo"%>
<%-- <%@page import="com.sina.sae.util.SaeUserInfo"%> --%>
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.util.Arrays"%>
<%@page import="java.lang.management.ThreadMXBean"%>
<%@page import="java.lang.management.CompilationMXBean"%>
<%@page import="java.lang.management.OperatingSystemMXBean"%>
<%@page import="java.lang.management.GarbageCollectorMXBean"%>
<%@page import="java.util.List"%>
<%@page import="java.lang.management.MemoryUsage"%>
<%@page import="java.lang.management.MemoryMXBean"%>
<%@page import="java.lang.management.ClassLoadingMXBean"%>
<%@page import="java.lang.management.RuntimeMXBean"%>
<%@page import="java.lang.management.ManagementFactory"%>
<%@page import="java.util.Date"%>
<%@ page language="java"   pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Sina App Engine Java</title>
<link rel="shortcut icon" href="<%=request.getContextPath() %>/favicon.ico" />
<link rel="stylesheet" type="text/css" href="css/theme.css" />
<link rel="stylesheet" type="text/css" href="css/style.css" />
<script type="text/javascript" src="js/jquery-1.7.1.js"></script>
<script src="js/highcharts.js"></script>
<script src="js/exporting.js"></script>
<script src="js/chartsutil.js"></script>
<!--[if IE]>
<link rel="stylesheet" type="text/css" href="css/ie-sucks.css" />
<![endif]-->
<%
	RuntimeMXBean rMXBean = ManagementFactory.getRuntimeMXBean();
	ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
	List<GarbageCollectorMXBean> aGCMXBeans = ManagementFactory.getGarbageCollectorMXBeans();
	
	String [] node = rMXBean.getName().split("@");//节点名称
 	String nodename = node[node.length-1];
 	String currentNode = nodename+request.getLocalPort();
	long cputime = threadMXBean.getCurrentThreadCpuTime()/1000000;//cpu时间
	long livethread = threadMXBean.getThreadCount();//活动线程数
	long topthread = threadMXBean.getPeakThreadCount();//峰值线程数
	long deamonthread = threadMXBean.getDaemonThreadCount();//守护线程数
	long totalthread = threadMXBean.getTotalStartedThreadCount();//创建线程总数
	long [] ids = threadMXBean.getAllThreadIds();//所有线程ID号
	//计算各类状态线程数量
	long newcount=0,runcount=0,blockedcount=0,waitingcount=0,twaitcount=0,terminatedcount=0;
	List<ThreadInfo> threads = new ArrayList<ThreadInfo>(); 
	for(int i=0;i<ids.length;i++){
		ThreadInfo tInfo =  threadMXBean.getThreadInfo(ids[i],Integer.MAX_VALUE);
		threads.add(tInfo);
		Thread.State state = tInfo.getThreadState();
		if(state.equals(Thread.State.NEW)){
			newcount++;
		}else if(state.equals(Thread.State.RUNNABLE)){
			runcount++;
		}else if(state.equals(Thread.State.BLOCKED)){
			blockedcount++;
		}else if(state.equals(Thread.State.WAITING)){
			waitingcount++;
		}else if(state.equals(Thread.State.TIMED_WAITING)){
			twaitcount++;
		}else if(state.equals(Thread.State.TERMINATED)){
			terminatedcount++;
		}
	}
%>
<script type="text/javascript">
	$(function () {
    	$(".over").hover(function(){
    	    $(this).css("background-color","#d9e6f0");
    	   },function(){
    	    $(this).css("background-color","");
    	 }).click(function(){
    		 ajaxData(this.id);
     	});
	});
	
	function ajaxData(id){
		$.ajax({type:"post", url:"ajax.jsp", data:{type:"threads",node:"<%=currentNode%>",threadId:id},
 			success:function(data,textStatus){
 			var text = $.trim(data);
			if(textStatus=="success"&&text!="error node"){
				$("#stacktrace").html(text);
			}else{
				//alert("Request error node,try again later!"+text);
				ajaxData(id);
			}
	  }});
	}
</script>
</head>
<body>
	<div id="container">
    	<div id="header">
<%--         	<h2>Sina App Engine Java  -    <%=SaeUserInfo.getAppName()%></h2> --%>
   	 		<div id="topmenu">
            	<ul>
                	<li ><a href="index.jsp">Overview</a></li>
                	<li><a href="appinfo.jsp">Application</a></li>
                    <li><a href="monitor.jsp">Monitor</a></li>
                	<li><a href="memory.jsp">Memory</a></li>
                    <li  class="current"><a href="threads.jsp">Threads</a></li>
              </ul>
          	</div>
      </div>
        <div id="wrapper">
            <div id="bigcontent">
             <div id="rightnow">
                    <h3 class="reallynow">
                        <%-- <span>Threads  -  <%=SaeUserInfo.getAppName() %></span> --%>
                        <a href="threads.jsp" ><b>Refresh All</b> </a>
                        <br />
                    </h3>
				    <p class="youhave">
				   		<strong>节点名称: <%=nodename %></strong>
				    	                
				   		<strong>线程CPU时间: <%=cputime %> ms </strong>
				   	</p>
		   	</div><br/>
		   	
			  <div id="rightnow">
                    <h3 class="reallynow">
                        <span>Overview </span>
                        <br />
                    </h3>
				    <p class="youhave">
				    	
				    	<strong>创建线程总数: <%=totalthread %></strong>
				    	           
				    	<strong> 活动线程数: <%=livethread %></strong>
				    	                
				    	<strong>峰值线程数:<%=topthread %></strong> 
				    	                
				    	<strong>守护线程数: <%=deamonthread %> </strong>
				    	
				    	<br/><br/>
				    	<strong style="color: #3300CC">NEW 线程: <%=newcount  %></strong> 
				    	                
				    	<strong style="color: #009900">RUNNABLE 线程: <%=runcount %></strong>
				    	                
				    	<strong style="color: #FF0000">BLOCKED 线程: <%=blockedcount %></strong>
				    	                
				    	<strong style="color: #FFCC00">WATTING 线程: <%=waitingcount %></strong>
				    	                
				    	<strong style="color:#CC9933 ">TIMED_WATTING 线程: <%=twaitcount %></strong>
				    	                
				    	<strong style="color: #999999">TERMINATED 线程: <%=terminatedcount %></strong>
				    	<br/>
                    </p><br/>
                    <table style="width: 100%;margin: 0;table-layout:fixed;word-wrap:break-word;word-break:break-all;">
                  	<thead>
						<tr style="font-size: x-small;text-align: left;height: 28">
                          	<th  width="25%">  Thread Name </th>
                              <th > Thread Info</th>
                        </tr>
					</thead>
					<tbody>
                			<%
                				String color ="";
                				for(int i=0;i<threads.size();i++){
                					ThreadInfo threadInfo = threads.get(i);	
                					Thread.State state = threadInfo.getThreadState();
                					if(state.equals(Thread.State.NEW)){
                						color = "#3300CC";//蓝色
                					}else if(state.equals(Thread.State.RUNNABLE)){
                						color = "#009900";//绿色
                					}else if(state.equals(Thread.State.BLOCKED)){
                						color = "#FF0000";//红色
                					}else if(state.equals(Thread.State.WAITING)){
                						color = "#FFCC00";//黄色
                					}else if(state.equals(Thread.State.TIMED_WAITING)){
                						color = "#CC9933";//土色
                					}else if(state.equals(Thread.State.TERMINATED)){
                						color = "#999999";//灰色
                					}
                					String threadName = threadInfo.getThreadName().length()<32?(threadInfo.getThreadName()):(threadInfo.getThreadName().substring(0, 32)+"....");;
                					StackTraceElement [] elements = threadInfo.getStackTrace();	
                			%>
                    			<tr>
	                    			<td class="over"   id="<%=threadInfo.getThreadId() %>" style="cursor: pointer;font-size: xx-small;color: <%=color%>" > 
	                     			<strong>
	                     				 <%=threadName %>
	                     			</strong>
	                    			</td>
	                    			<%if(i==0) {%>
	                    			<td rowspan="<%=threads.size()%>" valign="top"  >
	                    				 <p id="stacktrace" style="margin: 10px;font-size: x-small;font-weight: bold;">
	                    				 	请求节点:  <%=node[node.length-1] %><br/><br/>
	                    				 	线程名称:  <%= threadInfo.getThreadName()%><br/><br/>
	                    				 	线程状态:  <%=threadInfo.getThreadState() %> 
	                    				 	      
	                    				 	CPU时间: <%=threadMXBean.getThreadCpuTime(threadInfo.getThreadId())/(1000*1000) %> ms
	                    				 	      
	                    				 	阻塞总数:  <%= threadInfo.getBlockedCount()%>
	                    				 	      
	                    				 	等待总数:  <%= threadInfo.getWaitedCount()%><br/><br/>
	                    				 	堆栈跟踪:  <br/><br/>
	                    				 	<% for (StackTraceElement e : threadInfo.getStackTrace()){%>
	                    				 		 <%=e.toString()+"<br/>" %>
	                    				 	<%} %>
	                    				 </p>
	                    			</td>
	                    			<% }%>
                    			</tr>
                           			<%
                           				}
                           			%>
                     </tbody>
                  </table>
			  </div>
               <br/>
              
                            	 
            </div>
      </div>
</div>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值