JVM工具类,提供jstack jmap memory等信息的输出.
import java.io.File; import java.io.OutputStream; import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; import java.security.AccessController; import java.security.PrivilegedExceptionAction; import java.util.Iterator; import java.util.Map; import java.util.Set; import javax.management.MBeanServer; import javax.management.ObjectName; import com.sun.management.HotSpotDiagnosticMXBean; public class JVMUtil { private static final String HOTSPOT_BEAN_NAME = "com.sun.management:type=HotSpotDiagnostic"; private static volatile HotSpotDiagnosticMXBean hotspotMBean; private static volatile MemoryMXBean memoryMBean; private static Object lock = new Object(); public static void jMap(String fileName, boolean live) throws Exception { try { initHotspotMBean(); File f = new File(fileName); if (f.exists()) { f.delete(); } hotspotMBean.dumpHeap(fileName, live); } catch (Exception e) { throw e; } } public static void jstack(OutputStream stream) throws Exception { try { Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces(); Iterator<Map.Entry<Thread, StackTraceElement[]>> ite = map.entrySet().iterator(); while (ite.hasNext()) { Map.Entry<Thread, StackTraceElement[]> entry = ite.next(); StackTraceElement[] elements = entry.getValue(); if (elements != null && elements.length > 0) { String threadName = entry.getKey().getName(); stream.write(("Thread Name :[" + threadName + "]\n").getBytes()); for (StackTraceElement el : elements) { String stack = el.toString() + "\n"; stream.write(stack.getBytes()); } stream.write("\n".getBytes()); } } } catch (Exception e) { throw e; } } public static double memoryUsed(OutputStream stream) throws Exception { try { initMemoryMBean(); stream.write("**********************************Memory Used**********************************\n".getBytes()); String heapMemoryUsed = memoryMBean.getHeapMemoryUsage().toString() + "\n"; stream.write(("Heap Memory Used: " + heapMemoryUsed).getBytes()); String nonHeapMemoryUsed = memoryMBean.getNonHeapMemoryUsage().toString() + "\n"; stream.write(("NonHeap Memory Used: " + nonHeapMemoryUsed).getBytes()); return (double) (memoryMBean.getHeapMemoryUsage().getUsed()) / memoryMBean.getHeapMemoryUsage().getMax(); } catch (Exception e) { throw e; } } private static HotSpotDiagnosticMXBean getHotspotMBean() throws Exception { try { return AccessController.doPrivileged(new PrivilegedExceptionAction<HotSpotDiagnosticMXBean>() { public HotSpotDiagnosticMXBean run() throws Exception { MBeanServer server = ManagementFactory.getPlatformMBeanServer(); Set<ObjectName> s = server.queryNames(new ObjectName(HOTSPOT_BEAN_NAME), null); Iterator<ObjectName> itr = s.iterator(); if (itr.hasNext()) { ObjectName name = itr.next(); HotSpotDiagnosticMXBean bean = ManagementFactory.newPlatformMXBeanProxy(server, name.toString(), HotSpotDiagnosticMXBean.class); return bean; } else { return null; } } }); } catch (Exception exp) { throw exp; } } private static MemoryMXBean getMemoryMBean() throws Exception { try { return AccessController.doPrivileged(new PrivilegedExceptionAction<MemoryMXBean>() { public MemoryMXBean run() throws Exception { return ManagementFactory.getMemoryMXBean(); } }); } catch (Exception exp) { throw exp; } } private static void initHotspotMBean() throws Exception { if (hotspotMBean == null) { synchronized (lock) { if (hotspotMBean == null) { hotspotMBean = getHotspotMBean(); } } } } private static void initMemoryMBean() throws Exception { if (memoryMBean == null) { synchronized (lock) { if (memoryMBean == null) { memoryMBean = getMemoryMBean(); } } } } }