博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM Profiler StacktraceCollectorProfiler
阅读量:6349 次
发布时间:2019-06-22

本文共 2964 字,大约阅读时间需要 9 分钟。

开篇

 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
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"}

转载地址:http://eytla.baihongyu.com/

你可能感兴趣的文章
用 Go 写一个轻量级的 ssh 批量操作工具
查看>>
网站设计之合理架构CSS 架构CSS
查看>>
OTP 22.0 RC3 发布,Erlang 编写的应用服务器
查看>>
D语言/DLang 2.085.1 发布,修复性迭代
查看>>
感觉JVM的默认异常处理不够好,既然不好那我们就自己来处理异常呗!那么如何自己处理异常呢?...
查看>>
Java 基础 之 算数运算符
查看>>
Windows下配置安装Git(二)
查看>>
一个最简单的基于Android SearchView的搜索框
查看>>
铁路开通WiFi“钱景”不明
查看>>
Nutanix领衔的超融合能带来新存储黄金时代吗?
查看>>
Facebook申请专利 或让好友及陌生人相互拼车
查看>>
电力“十三五”规划:地面光伏与分布式的分水岭
查看>>
美联社再告FBI:要求公开请黑客解锁iPhone花费
查看>>
三星电子出售希捷和夏普等四家公司股份
查看>>
任志远:当云计算遇上混合云
查看>>
思科联手发那科 用物联网技术打造无人工厂
查看>>
智慧城市首要在政府利用大数据的智慧
查看>>
2015年物联网行业:巨头展开专利大战
查看>>
以自动化测试撬动遗留系统
查看>>
网络安全初创公司存活之道
查看>>