轻松获取jvm线程的java api

轻松获取jvm线程的代码

<%@ page import="java.util.Iterator" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" session="false" language="java"%>
<html>
<head>
    <title>Threads</title>
    <script>
        function toggleStacks(id) {
            var ele = document.getElementById(id);
            if(!ele.style.display || ele.style.display != "none") {
                ele.style.display = "none";
            } else {
                ele.style.display = "block";
            }
            return false;
        }
    </script>
    <style type="text/css">
        li {
            list-style-type: none;
            display: inline;
        }
    </style>
</head>
<body>
<a href="javascript:void(0)" onclick="return toggleStacks(‘system-res‘);">resource</a><br/>
<div id="system-res">
    <ul>
        <li>freeMemory: <%=Runtime.getRuntime().freeMemory()/(1024*1024)%>M;</li>
        <li>totalMemory: <%=Runtime.getRuntime().totalMemory()/(1024*1024)%>M;</li>
        <li>maxMemory: <%=Runtime.getRuntime().maxMemory()/(1024*1024)%>M;</li>
    </ul>
</div>
<%
    Map<Thread, StackTraceElement[]> allStacks = Thread.getAllStackTraces();
    Map<Thread.State, Map<Thread, StackTraceElement[]>> classifyThreads = new HashMap<Thread.State, Map<Thread, StackTraceElement[]>>();
    if (allStacks != null) {
        Iterator<Map.Entry<Thread, StackTraceElement[]>> stackIterator = allStacks.entrySet().iterator();
        while (stackIterator.hasNext()) {
            Map.Entry<Thread, StackTraceElement[]> stackEntry = stackIterator.next();
            Thread thread = stackEntry.getKey();
            Thread.State state = thread.getState();
            StackTraceElement[] traceElements = stackEntry.getValue();
            Map<Thread, StackTraceElement[]> threadStacks = classifyThreads.get(state);
            if(threadStacks == null) {
                threadStacks = new HashMap<Thread, StackTraceElement[]>();
                classifyThreads.put(state, threadStacks);
            }
            threadStacks.put(thread, traceElements);

        }
    }

    for(Thread.State state : Thread.State.values()) {
        Map<Thread, StackTraceElement[]> threadStacks = classifyThreads.get(state);
        if(threadStacks != null) {
            Iterator<Map.Entry<Thread, StackTraceElement[]>> stackIterator = threadStacks.entrySet().iterator();
            out.println("<b>"+state.name()+"("+threadStacks.size()+")</b><br/><hr/>");
            while (stackIterator.hasNext()) {
                Map.Entry<Thread, StackTraceElement[]> stackEntry = stackIterator.next();
                Thread thread = stackEntry.getKey();
                StackTraceElement[] traceElements = stackEntry.getValue();
                out.println("<pre>");
                out.println("<a href=\"javascript:void(0);\" onclick=\"return toggleStacks(‘thread-"+thread.getId()+"‘);\">" + thread + "-" + thread.getState() + ":" + thread.getId()  + "(" + traceElements.length + ")</a>");
                if(traceElements != null) {
                    out.println("<div id=\"thread-"+thread.getId()+"\" style=\"display:none;\">");
                    for(StackTraceElement stack : traceElements) {
                        out.println("    " + stack + " - " + stack.getFileName());
                    }
                    out.println("<div>");
                }
                out.println("</pre>");
            }
            out.println("<br/>");
        }
    }
%>
</body>
</html>

实现类似jstack的功能

时间: 2024-11-05 22:35:45

轻松获取jvm线程的java api的相关文章

一夜搞懂 | JVM 线程安全与锁优化

前言 本文已经收录到我的 Github 个人博客,欢迎大佬们光临寒舍: 我的 GIthub 博客 学习导图 一.为什么要学习内存模型与线程? 之前我们学习了内存模型和线程,了解了 JMM 和线程,初步探究了 JVM 怎么实现并发,而本篇文章,我们的关注点是 JVM 如何实现高效 并发编程的目的是为了让程序运行得更快,提高程序的响应速度,虽然我们希望通过多线程执行任务让程序运行得更快,但是同时也会面临非常多的挑战,比如像线程安全问题.线程上下文切换的问题.硬件和软件资源限制等问题,这些都是并发编程

[Java Performance] JVM 线程调优

调整线程栈空间 当非常缺少内存时,可以调整线程使用的内存.每个线程都有一个栈,用来记录该线程的调用栈信息.线程中的栈的默认空间是有OS和JVM的版本决定的: OS 32-bit 64-bit Linux 320 KB 1 MB Mac OS N/A 1 MB Solaris Sparc 512 KB 1 MB Solaris X86 320 KB 1 MB Windows 320 KB 1 MB 当栈空间被设置的过小时,可能会因为有较长的调用栈而抛出StackOverflowError. 在64

在NDK C++线程中如何调用JAVA API

from://http://www.eoeandroid.com/thread-150995-1-1.html 在NDK中创建的线程中, 只允许调用静态的Java API. 当在线程中调用env->FindClass(), 系统就会发出异常.http://android.wooyd.org/JNIExample中有较详细的调用说明. 示例代码如下: JAVA 代码:public class simple_test extends Activity {    ...    public stati

JTI + JNI,为Java程序提供获取JVM内部信息的通道

首先,JTI是啥? HotSpot JVM是使用C++写的,在操作系统层面来看,java.exe进程与其他进程并无特别之处.任何一个进程都可以加载第三方的DLL,JTI就是java.exe开放出来的向Java.exe进程注入dll的接口.也就是说,开发者根据JTI定义好的规范,用C++写一个dll,这个dll就可以被java.exe进程加载了[启动jvm的时候要加上-agentlib参数]. JTI的详细资料参见以下网址:http://docs.oracle.com/javase/7/docs/

Elasticsearch JAVA api轻松搞定groupBy聚合

本文给出如何使用Elasticsearch的Java API做类似SQL的group by聚合. 为了简单起见,只给出一级groupby即group by field1(而不涉及到多级,例如group by field1, field2, ...):如果你需要多级的groupby,在实现上可能需要拆分的更加细致. 即将给出的方法,适用于如下的场景: 场景1:找出分组中的所有桶,例如,select group_name from index_name group by group_name; 场景

JAVA代码中获取JVM信息

一.JAVA中获取JVM的信息 原理,利用JavaSDK自带的ManagementFactory类来获取. 二.获取信息 1.获取进程ID @Test public void test1() { RuntimeMXBean mxb = ManagementFactory.getRuntimeMXBean(); System.out.println(mxb.getName()); //[email protected] } 2.获取ManagementFactory.getRuntimeMXBea

Java中如何获取到线程dump文件

死循环.死锁.阻塞.页面打开慢等问题,打线程dump是最好的解决问题的途径.所谓线程dump也就是线程堆栈,获取到线程堆栈有两步: (1)获取到线程的pid,可以通过使用jps命令,在Linux环境下还可以使用ps -ef | grep java (2)打印线程堆栈,可以通过使用jstack pid命令,在Linux环境下还可以使用kill -3 pid 另外提一点,Thread类提供了一个getStackTrace()方法也可以用于获取线程堆栈.这是一个实例方法,因此此方法是和具体线程实例绑定

JavaSE中线程与并行API框架学习笔记——线程为什么会不安全?

前言:休整一个多月之后,终于开始投简历了.这段时间休息了一阵子,又病了几天,真正用来复习准备的时间其实并不多.说实话,心里不是非常有底气. 这可能是学生时代遗留的思维惯性--总想着做好万全准备才去做事.当然,在学校里考试之前当然要把所有内容学一遍和复习一遍.但是,到了社会里做事,很多时候都是边做边学.应聘如此,工作如此,很多的挑战都是如此.没办法,硬着头皮上吧. 3.5 线程的分组管理 在实际的开发过程当中,可能会有多个线程同时存在,这对批量处理有了需求.这就有点像用迅雷下载电视剧,假设你在同时

Java API 各个包的内容解释

java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类. java.awt 包含用于创建用户界面和绘制图形图像的所有类. java.awt.color 提供用于颜色空间的类. java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类. java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关