%@page import="org.apache.jasper.tagplugins.jstl.core.Out"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.lang.management.ThreadInfo"%>
<%@page import="java.lang.management.ThreadMXBean"%>
<%@page import="java.lang.management.ManagementFactory"%>
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="/WEB-INF/c.tld"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
Threads in ldcstudy.com
java.io.tmpdir:
- <%=System.getProperty("java.io.tmpdir")%>
Memory:
- freeMemory=<%=Runtime.getRuntime().freeMemory()/(1024*1024)%>M
- totalMemory=<%=Runtime.getRuntime().totalMemory()/(1024*1024)%>M
- maxMemory=<%=Runtime.getRuntime().maxMemory()/(1024*1024)%>M
Thread:
<%
for(Thread t : list_threads()){%>
- <%=t.getName()%>(<%=t.getState()%>)[<%=timemap.get(t.getId()) %>] : <%=t.getClass().getName()%>
<%}%>
<%!
public static java.util.List list_threads(){
int tc = Thread.activeCount();
Thread[] ts = new Thread[tc];
Thread.enumerate(ts);
return java.util.Arrays.asList(ts);
}
public static Map cputime(){
ThreadMXBean tm = ManagementFactory.getThreadMXBean();
tm.setThreadContentionMonitoringEnabled(true);
long [] tid = tm.getAllThreadIds();
ThreadInfo [] tia = tm.getThreadInfo(tid, Integer.MAX_VALUE);
long [][] threadArray = new long[tia.length][2];
Map map = new HashMap();
for (int i = 0; i < tia.length; i++) {
long threadId = tia[i].getThreadId();
long cpuTime = tm.getThreadCpuTime(tia[i].getThreadId())/(1000*1000*1000);
//threadArray[i][0] = threadId;
//threadArray[i][1] = cpuTime;
map.put(threadId, cpuTime);
}
return map;
}
Map timemap = cputime();
Map cpuTimes = new HashMap();
Map cpuTimeFetch = new HashMap();
%>
<%
long cpus = Runtime.getRuntime().availableProcessors();
ThreadMXBean threads = ManagementFactory.getThreadMXBean();
threads.setThreadContentionMonitoringEnabled(true);
long now = System.currentTimeMillis();
ThreadInfo[] t = threads.dumpAllThreads(false, false);
out.print("t.length...." + t.length);
int blockCount = 0;
for (int i = 0; i < t.length; i++) {
long id = t[i].getThreadId();
Long idObj = new Long(id);
long current = 0;
if (cpuTimes.get(idObj) != null) {
long prev = ((Long) cpuTimes.get(idObj)).longValue();
current = threads.getThreadCpuTime(t[i].getThreadId());
long catchTime = ((Long) cpuTimes.get(idObj)).longValue();
double percent = (double)(current - prev) / (double)((now - catchTime) * cpus * 1000);
out.print("" + t[i].getThreadName()+ ":" + t[i].getBlockedTime() + ":" + percent + " : " + prev + "");
if (percent > 0 && prev > 0) {
out.println("" + t[i].getThreadName()+"#"+t[i].getThreadId() + " Time: " + percent + " (" + prev + ", " + current + ") ");
String locked = t[i].getLockInfo()==null?"":t[i].getLockInfo().getClass().toString();
out.println(" Blocked: (" + t[i].getBlockedTime() + ", " + t[i].getBlockedCount() + ", " + locked + ")");
StackTraceElement[] te = t[i].getStackTrace();
out.println("");
for(int j = 0; j < te.length; j++){
out.println("- " + te[j].getClassName()+"#"+te[j].getMethodName() + " (LineNumber: " + te[j].getLineNumber() + ") ");
}
out.println("
");
blockCount ++;
}
}
cpuTimes.put(idObj, new Long(current));
cpuTimes.put(idObj, new Long(now));
}
out.print("总阻塞线程:" + blockCount +" 个");
%>
//源代码片段来自云代码http://yuncode.net