import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; /** * * @author agile.java@gmail.com */ public class MemeoryAwareTest { private static final MemoryAwareConcurrentReadMap map = new MemoryAwareConcurrentReadMap(); public void testScriptCompilation() { final int threadCount = 10; DeadCheck check = new DeadCheck(); check.start(); Thread[] ts = new Thread[threadCount * 2]; for (int i = 0; i < threadCount; i++) { ScriptRunner runner = new ScriptRunner(i); ScriptRunner runner2 = new ScriptRunner(i); ts[i * 2] = runner; ts[i * 2 + 1] = runner2; } for (int i = 0; i < ts.length; i++) { ts[i].start(); } for (int i = 0; i < ts.length; i++) { try { ts[i].join(); } catch (InterruptedException e) { e.printStackTrace(); } } check.isRun = false; } public static class ScriptRunner extends Thread { private int index = 0; public ScriptRunner(int index) { this.index = index; } public void run() { for (int i = 0; i < 20; i++) { map.put(index, index); map.get(index); } } } public static class DeadCheck extends Thread { public volatile boolean isRun = true; public void run() { while (isRun) { ThreadMXBean mxBean = ManagementFactory.getThreadMXBean(); long[] lockedIds = mxBean.getAllThreadIds(); ThreadInfo[] tis = mxBean.getThreadInfo(lockedIds, Integer.MAX_VALUE); System.out.println("Begin check thread info......................"); for (int i = 0; i < tis.length; i++) { ThreadInfo ti = tis[i]; if (ti == null) { continue; } //System.out.println("Map concurrentReads:"+map.concurrentReads); if (ti.getThreadState() == Thread.State.BLOCKED) { System.out.println(ti.getThreadId()+" lockName:" + ti.getLockName() + " lockOwnerId:" + ti.getLockOwnerId() + " Lock Thread:" + mxBean.getThreadInfo(ti.getLockOwnerId())); StackTraceElement[] ses = ti.getStackTrace(); for (int j = 0; j < ses.length; j++) { System.out.println(ses[j].getClassName() + " " + ses[j].getMethodName() + " at " + ses[j].getLineNumber()); } ThreadInfo lockTi = mxBean.getThreadInfo(ti .getLockOwnerId(), Integer.MAX_VALUE); if (lockTi != null) { ses = lockTi.getStackTrace(); System.out.println("lock Stack Trace:"); for (int j = 0; j < ses.length; j++) { System.out.println(ses[j].getClassName() + " " + ses[j].getMethodName() + " at " + ses[j].getLineNumber()); } } try { Thread.sleep(1000); } catch (Throwable t) { } } } } } } public static void main(String[] args) { MemeoryAwareTest cct = new MemeoryAwareTest(); cct.testScriptCompilation(); } }