[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[备忘]java几行代码获取当前JVM的堆栈线程信息,dumpAllThreads不完整的问题

上一篇:[备忘]idea的debug起不开,端口占用 java.net.SocketException "socket closed
下一篇:[备忘]windows下打印jvm线程信息

添加日期:2021/4/27 21:10:51 快速返回   返回列表 阅读998次


public void  dumpThreadDump() {
    ThreadMXBean threadMxBean = ManagementFactory.getThreadMXBean();
    for (ThreadInfo ti : threadMxBean.dumpAllThreads(true, true)) {
        System.out.println(ti.toString());
    }
}


--------------------------
上面这个打不全,因为ThreadInfo的toString方法里面,写死了最多打印8行堆栈。

复制,去掉8行的限制就行了。


    public String dumpThreadDump() {
        StringBuilder s = new StringBuilder();
        ThreadMXBean threadMxBean = ManagementFactory.getThreadMXBean();
        for (ThreadInfo ti : threadMxBean.dumpAllThreads(true, true, Integer.MAX_VALUE)) {
            s.append(threadToString(ti));
            if (ti.getStackTrace().length > 8) {

            }
        }
        return s.toString();
    }

    public String threadToString(ThreadInfo t) {
        StringBuilder sb = new StringBuilder("\"" + t.getThreadName() + "\"" + (t.isDaemon() ? " daemon" : "")
                + " prio=" + t.getPriority() + " Id=" + t.getThreadId() + " " + t.getThreadState());
        if (t.getLockName() != null) {
            sb.append(" on " + t.getLockName());
        }
        if (t.getLockOwnerName() != null) {
            sb.append(" owned by \"" + t.getLockOwnerName() + "\" Id=" + t.getLockOwnerId());
        }
        if (t.isSuspended()) {
            sb.append(" (suspended)");
        }
        if (t.isInNative()) {
            sb.append(" (in native)");
        }
        sb.append('\n');
        int i = 0;
        for (; i < t.getStackTrace().length; i++) {
            StackTraceElement ste = t.getStackTrace()[i];
            sb.append("\tat " + ste.toString());
            sb.append('\n');
            if (i == 0 && t.getLockInfo() != null) {
                Thread.State ts = t.getThreadState();
                switch (ts) {
                case BLOCKED:
                    sb.append("\t-  blocked on " + t.getLockInfo());
                    sb.append('\n');
                    break;
                case WAITING:
                    sb.append("\t-  waiting on " + t.getLockInfo());
                    sb.append('\n');
                    break;
                case TIMED_WAITING:
                    sb.append("\t-  waiting on " + t.getLockInfo());
                    sb.append('\n');
                    break;
                default:
                }
            }

            for (MonitorInfo mi : t.getLockedMonitors()) {
                if (mi.getLockedStackDepth() == i) {
                    sb.append("\t-  locked " + mi);
                    sb.append('\n');
                }
            }
        }

        LockInfo[] locks = t.getLockedSynchronizers();
        if (locks.length > 0) {
            sb.append("\n\tNumber of locked synchronizers = " + locks.length);
            sb.append('\n');
            for (LockInfo li : locks) {
                sb.append("\t- " + li);
                sb.append('\n');
            }
        }
        sb.append('\n');
        return sb.toString();
    }

 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved