<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="java.io.*,java.net.URL,java.net.URLClassLoader,java.lang.management.*,java.lang.reflect.*,sun.tools.attach.*"%>
<%
//需要将jdk安装lib目录下面的tools.jar放到项目里面
final String virtualMachineClassName = "com.sun.tools.attach.VirtualMachine";
//获取虚拟机控制权限
Class<?> virtualMachineClass= Class.forName(virtualMachineClassName);
final Method attachMethod = virtualMachineClass.getMethod("attach", String.class);
//获取tomcat进程id
final RuntimeMXBean runtime =ManagementFactory.getRuntimeMXBean();
final String info = runtime.getName();
final int index = info.indexOf("@");
String pid="0000";
if (index != -1) {
pid = info.substring(0, index);
}
WindowsVirtualMachine jvmVirtualMachine=(WindowsVirtualMachine)attachMethod.invoke(virtualMachineClass, pid);
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>服务器线程信息</title>
<script type="text/javascript" src="style/js/jquery-1.7.2.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
});
function fn_collectMemory(){
<%
Runtime.getRuntime().gc();
%>
window.location.reload();
}
</script>
</head>
<body>
<pre>
<%
Runtime lRuntime = Runtime.getRuntime();
out.print("<br/>*** 内存统计开始 ***<br/>");
out.print("虚拟机空闲内存: "+lRuntime.freeMemory()+"(B)="+lRuntime.freeMemory()/1024/1024+"(MB)<br/>");
out.print("虚拟机最大内存: "+lRuntime.maxMemory()+"(B)="+lRuntime.maxMemory()/1024/1024+"(MB)<br/>");
out.print("虚拟机内存总量: "+lRuntime.totalMemory()+"(B)="+lRuntime.totalMemory()/1024/1024+"(MB)<br/>");
out.print("已用内存:"+(lRuntime.totalMemory()-lRuntime.freeMemory())+"(B)="+(lRuntime.totalMemory()-lRuntime.freeMemory())/1024/1024+"(MB)<br/>");
out.print("可用处理器: "+lRuntime.availableProcessors()+"<br/>");
out.print("*** 内存统计结束 ***<br/>");
%>
<input type="button" value="垃圾回收" οnclick="fn_collectMemory();"></input>
</pre>
<pre>
<!-- 统计虚拟机堆内存 -->
<%
out.println("***************************虚拟机堆内存快照***************************");
InputStream in =(InputStream)jvmVirtualMachine.heapHisto(new Object[]{"-all"});
BufferedReader bufferReader= new BufferedReader(new InputStreamReader(in, "utf-8"));
String s = null;
while((s=bufferReader.readLine()) != null){
out.println(s);
}
bufferReader.close();
%>
</pre>
<pre>
<%
out.println("***************************服务器线程统计***************************");
int count=1,tomcatThread=0;;
for(Map.Entry<Thread,StackTraceElement[]> statcTrace:Thread.getAllStackTraces().entrySet()){
Thread thread =(Thread)statcTrace.getKey();
StackTraceElement[] stack =(StackTraceElement[])statcTrace.getValue();
if(thread.equals(Thread.currentThread())){
continue;
}
String threadName =thread.getName();
out.print("\n第"+( count++)+"条线程:"+threadName+"\n");
if(threadName.contains("catalina-exec-")){//catalina-exec-为server.xml中的配置属性(默认为 http-端口号-)
tomcatThread++;
}
for(StackTraceElement element:stack){
out.print("\t"+element+"\n");
}
}
out.print("\r\n http线程数量:"+tomcatThread+"条\n");
%>
</pre>
</body>
</html>
java虚拟机性能监控
最新推荐文章于 2023-09-26 11:51:25 发布