String selfName = ManagementFactory.getRuntimeMXBean().getName(); final int selfPid = Integer.valueOf(selfName.substring(0, selfName.indexOf('@'))); HotSpotVirtualMachine vm = (HotSpotVirtualMachine) VirtualMachine.attach(Integer.toString(selfPid)); InputStream sDump = vm.remoteDataDump(new Object[]{"-l"}); // lowercase L for lock dump
@Override public Void perform(VirtualMachine vm) throws Exception { InputStream is = ((HotSpotVirtualMachine)vm).remoteDataDump(args); try { Reader r = new InputStreamReader(is); CharBuffer cb = CharBuffer.allocate(16 << 10); while(true) { int m = r.read(cb.array()); if (m < 0) { break; } cb.limit(m); writer.append(cb); cb.clear(); } return null; } finally { try { is.close(); } catch(IOException e) { // ignore } } } }
InputStream in = hsvm.remoteDataDump("-l");
public static byte[] getThreadDump(int pid) throws AttachNotSupportedException, IOException { HotSpotVirtualMachine virtualMachine = null; try { virtualMachine = (HotSpotVirtualMachine) VirtualMachine.attach(String.valueOf(pid)); try (InputStream in = virtualMachine.remoteDataDump()) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); int count; byte[] buf = new byte[256]; while ((count = in.read(buf)) != -1) { baos.write(buf, 0, count); } return baos.toByteArray(); } } finally { if (virtualMachine != null) { try { virtualMachine.detach(); } catch (IOException ignore) { } } } } public static String getThreadDumpAsString(int pid) throws AttachNotSupportedException, IOException {
InputStream in = ((HotSpotVirtualMachine) vm).remoteDataDump((Object[]) args);