JVM Profiler StacktraceCollectorProfiler

简介: 开篇 StacktraceCollectorProfiler主要用来采集线程的调用栈,原理是通过ManagementFactory.getThreadMXBean()返回的ThreadMXBean对象来实现。

开篇

 StacktraceCollectorProfiler主要用来采集线程的调用栈,原理是通过ManagementFactory.getThreadMXBean()返回的ThreadMXBean对象来实现。

源码分析

    public void profile() {
        // 获取此刻所有线程的dump信息
        ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
        if (threadInfos == null) {
            return;
        }
        
        // 遍历线程信息并处理每个线程
        for (ThreadInfo threadInfo : threadInfos) {
            String threadName = threadInfo.getThreadName();
            if (threadName == null) {
                threadName = "";
            }
            
            if (!ignoreThreadNamePrefix.isEmpty()
                    && threadName.startsWith(ignoreThreadNamePrefix)) {
                continue;
            }
            
            // 获取线程的调用栈
            StackTraceElement[] stackTraceElements = threadInfo.getStackTrace();

            // 创建调用栈对象
            Stacktrace stacktrace = new Stacktrace();
            stacktrace.setThreadName(threadName);
            stacktrace.setThreadState(String.valueOf(threadInfo.getThreadState()));

            // 创建保存调用栈的list
            int totalLength = 0;
            List<ClassAndMethod> stack = new ArrayList<>(stackTraceElements.length);
            // 按照倒序保存调用链,最底层的放在最前面,把最根本的原因发在前面
            for (int i = stackTraceElements.length - 1; i >= 0; i--) {
                StackTraceElement stackTraceElement = stackTraceElements[i];
                String className = String.valueOf(stackTraceElement.getClassName());
                String methodName = String.valueOf(stackTraceElement.getMethodName());
                stack.add(new ClassAndMethod(className, methodName));

                totalLength += className.length() + methodName.length();
                // 如果长度超出限制,那么就截断
                if (totalLength >= Constants.MAX_STRING_LENGTH) {
                    stack.add(new ClassAndMethod("_stack_", "_trimmed_"));
                    break;
                }
            }
            
            // 反转调用链,把最底层的放在最前面。
            ClassAndMethod[] classAndMethodArray = new ClassAndMethod[stack.size()];
            for (int i = 0; i < stack.size(); i++) {
                classAndMethodArray[classAndMethodArray.length - 1 - i] = stack.get(i);
            }
            
            stacktrace.setStack(classAndMethodArray);
            
            buffer.appendValue(stacktrace);
        }
    }


采集结果

调用链的反向序列为:

  • java.lang.Thread.sleep
  • com.uber.profiling.examples.HelloWorldApplication.privateSleepMethod
  • com.uber.profiling.examples.HelloWorldApplication.main
{
    "stacktrace": ["java.lang.Thread.sleep", "com.uber.profiling.examples.HelloWorldApplication.privateSleepMethod", "com.uber.profiling.examples.HelloWorldApplication.main"],
    "endEpoch": 1536072801080,
    "appId": null,
    "host": "xiaozhideMacBook-Pro.local",
    "name": "2203@xiaozhideMacBook-Pro.local",
    "processUuid": "1e580f6e-0493-4e5b-bee2-a61c5f7b097d",
    "threadState": "TIMED_WAITING",
    "count": 24,
    "tag": "mytag",
    "startEpoch": 1536072796084,
    "threadName": "main"
}
目录
相关文章
|
8月前
|
Java Android开发
JVM常用性能分析工具 2
JVM常用性能分析工具
71 0
|
8月前
|
监控 算法 Java
JVM常用性能分析工具 1
JVM常用性能分析工具
107 0
|
监控 数据可视化 Java
JVM调优——JVM监控工具jvisualvm的使用及GC插件安装
JVM调优——JVM监控工具jvisualvm的使用及GC插件安装
163 1
JVM调优——JVM监控工具jvisualvm的使用及GC插件安装
|
监控 数据可视化 Java
JVM系列之:GC调优基础以及初识jstat命令
JVM系列之:GC调优基础以及初识jstat命令
311 0
JVM系列之:GC调优基础以及初识jstat命令
|
分布式计算 监控 Java
Uber jvm profiler 使用
Uber jvm profiler 使用
241 0
Uber jvm profiler 使用
|
监控 Java
jvisualvm监控本地jvm
jvisualvm监控本地jvm
149 0
jvisualvm监控本地jvm
Java VisualVM添加Visual GC插件实现JVM性能调优
访问地址:https://visualvm.github.io/pluginscenters.html,找到自己JDK版本对应的插件下载地址(我的JDK版本为1.7.0_67):
230 0
Java VisualVM添加Visual GC插件实现JVM性能调优
|
Java 关系型数据库 Oracle
JVM 性能调优工具 jinfo
Jinfo 是 JDK 自带的命令,可以用来查看正在运行的 java 应用程序的扩展参数,包括Java System属性和JVM命令行参数;也可以动态的修改正在运行的 JVM 一些参数。当系统崩溃时,jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息。
1639 0
|
Java C语言
JVM 性能调优工具 jstat
Jstat是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。
2444 0
利用jvisualvm分析JVM,进行性能调优
什么是jvisualvm? jvisualvm是JDK自带分析工具。 可分析JDK1.6及其以上版本的JVM运行时的JVM参数、系统参数、堆栈、CPU使用等信息。可分析本地应用及远程应用。 在JDK1.6以上版本中自带。
5548 0