Advertisement
dig090

Java Dump Stack Programmatically

Jan 16th, 2013
4,660
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.82 KB | None | 0 0
  1. package com.j256;
  2.  
  3. import java.io.BufferedWriter;
  4. import java.io.File;
  5. import java.io.FileWriter;
  6. import java.io.IOException;
  7. import java.io.Writer;
  8. import java.lang.management.ManagementFactory;
  9. import java.lang.management.ThreadInfo;
  10. import java.lang.management.ThreadMXBean;
  11. import java.text.SimpleDateFormat;
  12. import java.util.Date;
  13. import java.util.HashMap;
  14. import java.util.Map;
  15.  
  16. /**
  17.  * Code which writes a stack dump for all threads to a file.
  18.  */
  19. public class DumpStack {
  20.  
  21.     // directory where the stack files are written
  22.     private static final String STACK_DUMP_DIR = "/var/tmp";
  23.  
  24.     // here for testing
  25.     public static void main(String[] args) throws Exception {
  26.         dumpStacks();
  27.     }
  28.  
  29.     public static void dumpStacks() throws IOException {
  30.         ThreadMXBean mxBean = ManagementFactory.getThreadMXBean();
  31.         ThreadInfo[] threadInfos = mxBean.getThreadInfo(mxBean.getAllThreadIds(), 0);
  32.         Map<Long, ThreadInfo> threadInfoMap = new HashMap<Long, ThreadInfo>();
  33.         for (ThreadInfo threadInfo : threadInfos) {
  34.             threadInfoMap.put(threadInfo.getThreadId(), threadInfo);
  35.         }
  36.  
  37.         // choose our dump-file
  38.         File dumpFile = new File(STACK_DUMP_DIR, "stacks." + System.currentTimeMillis());
  39.         Writer writer = new BufferedWriter(new FileWriter(dumpFile));
  40.         try {
  41.             dumpTraces(mxBean, threadInfoMap, writer);
  42.         } finally {
  43.             writer.close();
  44.         }
  45.     }
  46.  
  47.     private static void dumpTraces(ThreadMXBean mxBean, Map<Long, ThreadInfo> threadInfoMap, Writer writer)
  48.             throws IOException {
  49.         Map<Thread, StackTraceElement[]> stacks = Thread.getAllStackTraces();
  50.         writer.write("Dump of " + stacks.size() + " thread at "
  51.                 + new SimpleDateFormat("yyyy/MM/dd HH:mm:ss z").format(new Date(System.currentTimeMillis())) + "\n\n");
  52.         for (Map.Entry<Thread, StackTraceElement[]> entry : stacks.entrySet()) {
  53.             Thread thread = entry.getKey();
  54.             writer.write("\"" + thread.getName() + "\" prio=" + thread.getPriority() + " tid=" + thread.getId() + " "
  55.                     + thread.getState() + " " + (thread.isDaemon() ? "deamon" : "worker") + "\n");
  56.             ThreadInfo threadInfo = threadInfoMap.get(thread.getId());
  57.             if (threadInfo != null) {
  58.                 writer.write("    native=" + threadInfo.isInNative() + ", suspended=" + threadInfo.isSuspended()
  59.                         + ", block=" + threadInfo.getBlockedCount() + ", wait=" + threadInfo.getWaitedCount() + "\n");
  60.                 writer.write("    lock=" + threadInfo.getLockName() + " owned by " + threadInfo.getLockOwnerName()
  61.                         + " (" + threadInfo.getLockOwnerId() + "), cpu="
  62.                         + (mxBean.getThreadCpuTime(threadInfo.getThreadId()) / 1000000L) + ", user="
  63.                         + (mxBean.getThreadUserTime(threadInfo.getThreadId()) / 1000000L) + "\n");
  64.             }
  65.             for (StackTraceElement element : entry.getValue()) {
  66.                 writer.write("        ");
  67.                 writer.write(element.toString());
  68.                 writer.write("\n");
  69.             }
  70.             writer.write("\n");
  71.         }
  72.     }
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement