You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
arthas/doc/tt.html

134 lines
102 KiB
HTML

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
3 years ago
<meta name="generator" content="VuePress 2.0.0-beta.51">
<style>
:root {
--c-bg: #fff;
}
html.dark {
--c-bg: #22272e;
}
html, body {
background-color: var(--c-bg);
}
</style>
<script>
const userMode = localStorage.getItem('vuepress-color-scheme');
const systemDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
if (userMode === 'dark' || (userMode !== 'light' && systemDarkMode)) {
document.documentElement.classList.toggle('dark', true);
}
</script>
3 years ago
<link rel="icon" href="/images/favicon.ico"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta property="og:title" content="Arthas"><meta property="og:image:alt" content="Alibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas - alibaba/arthas: Alibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas"><meta property="og:image" content="/images/arthas_mate_image.png"><meta property="og:description" content="Alibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas - alibaba/arthas: Alibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas"><meta property="og:image:width" content="1200"><meta property="og:image:height" content="600"><meta property="twitter:image:src" content="/images/arthas_mate_image.png"><meta property="twitter:image:alt" content="Alibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas - alibaba/arthas: Alibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas"><meta itemprop="name" content="Arthas"><meta itemprop="image" content="/images/arthas_mate_image.png"><meta itemprop="description" content="Alibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas - alibaba/arthas: Alibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas"><script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?d5c5e25b100f0eb51a4c35c8a86ea9b4";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
2 years ago
</script><meta name="aes-config" content="pid=xux-opensource&user_type=101&uid=&username=&dim10=arthas"><script src="//g.alicdn.com/alilog/mlog/aplus_v2.js" id="beacon-aplus" exparams="clog=o&aplus&sidx=aplusSidx&ckx=aplusCkx"></script><script src="//g.alicdn.com/aes/??tracker/1.0.34/index.js,tracker-plugin-pv/2.4.5/index.js,tracker-plugin-event/1.2.5/index.js,tracker-plugin-jserror/1.0.13/index.js,tracker-plugin-api/1.1.14/index.js,tracker-plugin-perf/1.1.8/index.js,tracker-plugin-eventTiming/1.0.4/index.js"></script><title>tt | arthas</title><meta name="description" content="arthas 使用文档">
<link rel="modulepreload" href="/assets/app.5e87b7e3.js"><link rel="modulepreload" href="/assets/tt.html.2332c01e.js"><link rel="modulepreload" href="/assets/tt.html.fa4d9c56.js"><link rel="prefetch" href="/assets/index.html.960bfdd3.js"><link rel="prefetch" href="/assets/index.html.00e16dda.js"><link rel="prefetch" href="/assets/index.html.5723c979.js"><link rel="prefetch" href="/assets/advanced-use.html.e91c4971.js"><link rel="prefetch" href="/assets/advice-class.html.2029f175.js"><link rel="prefetch" href="/assets/agent.html.fa285ea6.js"><link rel="prefetch" href="/assets/arthas-properties.html.16fa7682.js"><link rel="prefetch" href="/assets/arthas3.html.1201931c.js"><link rel="prefetch" href="/assets/async.html.c6fad914.js"><link rel="prefetch" href="/assets/auth.html.c10c9f5e.js"><link rel="prefetch" href="/assets/base64.html.a6a4a2ad.js"><link rel="prefetch" href="/assets/batch-support.html.f57652c7.js"><link rel="prefetch" href="/assets/cat.html.b3497770.js"><link rel="prefetch" href="/assets/classloader.html.e98e7470.js"><link rel="prefetch" href="/assets/cls.html.d76c79c3.js"><link rel="prefetch" href="/assets/commands.html.27eec831.js"><link rel="prefetch" href="/assets/contact-us.html.63bd2c0b.js"><link rel="prefetch" href="/assets/dashboard.html.16d45267.js"><link rel="prefetch" href="/assets/docker.html.720ade72.js"><link rel="prefetch" href="/assets/download.html.789000ae.js"><link rel="prefetch" href="/assets/dump.html.3699c6ed.js"><link rel="prefetch" href="/assets/echo.html.4924a036.js"><link rel="prefetch" href="/assets/faq.html.86a513d4.js"><link rel="prefetch" href="/assets/getstatic.html.5fa1ed7e.js"><link rel="prefetch" href="/assets/grep.html.c520ae3b.js"><link rel="prefetch" href="/assets/groovy.html.8f04aa08.js"><link rel="prefetch" href="/assets/heapdump.html.2ddea4ab.js"><link rel="prefetch" href="/assets/help.html.34c42702.js"><link rel="prefetch" href="/assets/history.html.f851697e.js"><link rel="prefetch" href="/assets/http-api.html.1302a07d.js"><link rel="prefetch" href="/assets/idea-plugin.html.6cbc05e6.js"><link rel="prefetch" href="/assets/install-detail.html.845b09dc.js"><link rel="prefetch" href="/assets/jad.html.f42b73a8.js"><link rel="prefetch" href="/assets/jfr.html.050ed896.js"><link rel="prefetch" href="/assets/jvm.html.8f4f1b8d.js"><link rel="prefetch" href="/assets/keymap.html.3ca88526.js"><link rel="prefetch" href="/assets/logger.html.c26ab313.js"><link rel="prefetch" href="/assets/manual-install.html.768b3c2d.js"><link rel="prefetch" href="/assets/mbean.html.196c866d.js"><link rel="prefetch" href="/assets/mc.html.61492e8e.js"><link rel="prefetch" href="/assets/memory.html.e334106f.js"><link rel="prefetch" href="/assets/monitor.html.d612684e.js"><link rel="prefetch" href="/assets/ognl.html.8f9c2331.js"><link rel="prefetch" href="/assets/options.html.dfbba303.js"><link rel="prefetch" href="/assets/perfcounter.html.cbbc3ab7.js"><link rel="prefetch" href="/assets/profiler.html.9d3961e6.js"><link rel="prefetch" href="/assets/pwd.html.5140d483.js"><link rel="prefetch" href="/assets/quick-start.html.6ffb6846.js"><link rel="prefetch" href="/assets/quit.html.707ec74c.js"><link rel="prefetch" href="/assets/redefine.html.aa3d574d.js"><link rel="prefetch" href="/assets/release-notes.html.b07de003.js"><link rel="prefetch" href="/assets/reset.html.758b8323.js"><link rel="prefetch" href="/assets/retransform.html.a7c1ed5f.js"><link rel="prefetch" href="/assets/save-log.html.326b8ae5.js"><link rel="prefetch" href="/assets/sc.html.488c7d5c.js"><link rel="prefetch" href="/assets/session.html.80199657.js"><link rel="prefetch" href="/assets/sm.html.b85e4b76.js"><link rel="prefetch" href="/assets/spring-boot-starter.html.55dee76b.js"><link rel="prefetch" href="/assets/stack.html.72e5fa11.js"><link rel="prefetch" href="/assets/start-arthas.html.acb60428.js"><link rel="prefetch" href="/assets/stop.html.82d50e6c.js"><link rel="prefetch" href="/assets/sysenv.html.fb99f9f4.js"><link rel="prefetch" href="/assets/sysprop.html.603daacf.js"><link rel="prefetch" href="/assets/tee.html.30146805.js"><link
2 years ago
<link rel="stylesheet" href="/assets/style.cf0d4c26.css">
</head>
<body>
<div id="app"><!--[--><div class="theme-container"><!--[--><header class="navbar"><div class="toggle-sidebar-button" title="切换侧边栏" aria-expanded="false" role="button" tabindex="0"><div class="icon" aria-hidden="true"><span></span><span></span><span></span></div></div><span><a href="/" class="" data-v-a8869d06><!----><span class="site-name can-hide" data-v-a8869d06>arthas</span><span class="navbar-version" data-v-a8869d06>v4.0.1</span></a></span><div class="navbar-items-wrapper" style=""><!--[--><!--]--><nav class="navbar-items can-hide"><!--[--><div class="navbar-item"><a href="/" class="" aria-label="首页"><!--[--><!--]--> 首页 <!--[--><!--]--></a></div><div class="navbar-item"><a class="external-link" href="/doc/arthas-tutorials.html?language=cn&amp;id=arthas-basics" rel="noopener noreferrer" target="_blank" aria-label="在线教程"><!--[--><!--]--><span>在线教程</span><span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">在新窗口打开</span></span><!--[--><!--]--></a></div><div class="navbar-item"><a href="/doc/" class="router-link-active" aria-label="文档"><!--[--><!--]--> 文档 <!--[--><!--]--></a></div><div class="navbar-item"><a href="/doc/commands.md" class="" aria-label="命令列表"><!--[--><!--]--> 命令列表 <!--[--><!--]--></a></div><div class="navbar-item"><a href="/doc/download.md" class="" aria-label="下载"><!--[--><!--]--> 下载 <!--[--><!--]--></a></div><div class="navbar-item"><a href="/doc/expert/intro.md" class="" aria-label="专家答疑"><!--[--><!--]--> 专家答疑 <!--[--><!--]--></a></div><div class="navbar-item"><div class="navbar-dropdown-wrapper"><button class="navbar-dropdown-title" type="button" aria-label="版本"><span class="title">版本</span><span class="arrow down"></span></button><button class="navbar-dropdown-title-mobile" type="button" aria-label="版本"><span class="title">版本</span><span class="right arrow"></span></button><ul style="display:none;" class="navbar-dropdown"><!--[--><li class="navbar-dropdown-item"><a class="external-link" href="https://arthas.aliyun.com/3.x/" rel="noopener noreferrer" target="_blank" aria-label="v3.x"><!--[--><!--]--><span>v3.x</span><span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">在新窗口打开</span></span><!--[--><!--]--></a></li><!--]--></ul></div></div><div class="navbar-item"><div class="navbar-dropdown-wrapper"><button class="navbar-dropdown-title" type="button" aria-label="Select language"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1em" height="1em" style="height:1.25rem;width:1.25rem;vertical-align:bottom;" viewbox="0 0 24 24"><path fill="currentColor" d="M13.35 22q-.6 0-.862-.387q-.263-.388-.063-.963l3.65-9.675q.15-.4.563-.688Q17.05 10 17.5 10q.425 0 .85.287q.425.288.575.688l3.65 9.675q.2.575-.062.963q-.263.387-.888.387q-.275 0-.5-.175q-.225-.175-.325-.425l-.85-2.45H15.1l-.875 2.45q-.1.25-.35.425q-.25.175-.525.175Zm2.35-4.8h3.6l-1.75-4.95h-.1ZM7.15 8.55q.4.725.85 1.337q.45.613 1.05 1.263q1.1-1.2 1.825-2.462Q11.6 7.425 12.1 6H2q-.425 0-.712-.287Q1 5.425 1 5t.288-.713Q1.575 4 2 4h6V3q0-.425.288-.713Q8.575 2 9 2t.713.287Q10 2.575 10 3v1h6q.425 0 .7
Press Ctrl+C to abort.
Affect<span class="token punctuation">(</span>class-cnt:1 , method-cnt:1<span class="token punctuation">)</span> cost <span class="token keyword">in</span> <span class="token number">66</span> ms.
INDEX TIMESTAMP COST<span class="token punctuation">(</span>ms<span class="token punctuation">)</span> IS-RET IS-EXP OBJECT CLASS METHOD
-------------------------------------------------------------------------------------------------------------------------------------
<span class="token number">1000</span> <span class="token number">2018</span>-12-04 <span class="token number">11</span>:15:38 <span class="token number">1.096236</span> <span class="token boolean">false</span> <span class="token boolean">true</span> 0x4b67cf4d MathGame primeFactors
<span class="token number">1001</span> <span class="token number">2018</span>-12-04 <span class="token number">11</span>:15:39 <span class="token number">0.191848</span> <span class="token boolean">false</span> <span class="token boolean">true</span> 0x4b67cf4d MathGame primeFactors
<span class="token number">1002</span> <span class="token number">2018</span>-12-04 <span class="token number">11</span>:15:40 <span class="token number">0.069523</span> <span class="token boolean">false</span> <span class="token boolean">true</span> 0x4b67cf4d MathGame primeFactors
<span class="token number">1003</span> <span class="token number">2018</span>-12-04 <span class="token number">11</span>:15:41 <span class="token number">0.186073</span> <span class="token boolean">false</span> <span class="token boolean">true</span> 0x4b67cf4d MathGame primeFactors
<span class="token number">1004</span> <span class="token number">2018</span>-12-04 <span class="token number">11</span>:15:42 <span class="token number">17.76437</span> <span class="token boolean">true</span> <span class="token boolean">false</span> 0x4b67cf4d MathGame primeFactors
2 years ago
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="指定-class-最大匹配数量" tabindex="-1"><a class="header-anchor" href="#指定-class-最大匹配数量" aria-hidden="true">#</a> 指定 Class 最大匹配数量</h3><div class="language-bash ext-sh line-numbers-mode"><pre class="language-bash"><code>$ tt <span class="token parameter variable">-t</span> <span class="token parameter variable">-m</span> <span class="token number">1</span> demo.MathGame primeFactors
Press Q or Ctrl+C to abort.
Affect<span class="token punctuation">(</span>class count:1 , method count:1<span class="token punctuation">)</span> cost <span class="token keyword">in</span> <span class="token number">130</span> ms, listenerId: <span class="token number">1</span>.
INDEX TIMESTAMP COST<span class="token punctuation">(</span>ms<span class="token punctuation">)</span> IS-RET IS-EXP OBJECT CLASS METHOD
-------------------------------------------------------------------------------------------------------------------------------------
<span class="token number">1000</span> <span class="token number">2022</span>-12-25 <span class="token number">19</span>:41:45 <span class="token number">2.629929</span> <span class="token boolean">true</span> <span class="token boolean">false</span> 0x3bf400 MathGame primeFactors
<span class="token number">1001</span> <span class="token number">2022</span>-12-25 <span class="token number">19</span>:41:55 <span class="token number">0.146161</span> <span class="token boolean">false</span> <span class="token boolean">true</span> 0x3bf400 MathGame primeFactors
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul><li><p>命令参数解析</p><ul><li><p><code>-t</code></p><p>tt 命令有很多个主参数,<code>-t</code> 就是其中之一。这个参数的表明希望记录下类 <code>*Test</code><code>print</code> 方法的每次执行情况。</p></li><li><p><code>-n 3</code></p><p>当你执行一个调用量不高的方法时可能你还能有足够的时间用 <code>CTRL+C</code> 中断 tt 命令记录的过程,但如果遇到调用量非常大的方法,瞬间就能将你的 JVM 内存撑爆。</p><p>此时你可以通过 <code>-n</code> 参数指定你需要记录的次数,当达到记录次数时 Arthas 会主动中断 tt 命令的记录过程,避免人工操作无法停止的情况。</p></li><li><p><code>-m 1</code></p><p>通过 <code>-m</code> 参数指定 Class 匹配的最大数量,防止匹配到的 Class 数量太多导致 JVM 挂起,默认值是 50。</p></li></ul></li><li><p>表格字段说明</p></li></ul><table><thead><tr><th>表格字段</th><th>字段解释</th></tr></thead><tbody><tr><td>INDEX</td><td>时间片段记录编号,每一个编号代表着一次调用,后续 tt 还有很多命令都是基于此编号指定记录操作,非常重要。</td></tr><tr><td>TIMESTAMP</td><td>方法执行的本机时间,记录了这个时间片段所发生的本机时间</td></tr><tr><td>COST(ms)</td><td>方法执行的耗时</td></tr><tr><td>IS-RET</td><td>方法是否以正常返回的形式结束</td></tr><tr><td>IS-EXP</td><td>方法是否以抛异常的形式结束</td></tr><tr><td>OBJECT</td><td>执行对象的<code>hashCode()</code>,注意,曾经有人误认为是对象在 JVM 中的内存地址,但很遗憾他不是。但他能帮助你简单的标记当前执行方法的类实体</td></tr><tr><td>CLASS</td><td>执行的类名</td></tr><tr><td>METHOD</td><td>执行的方法名</td></tr></tbody></table><ul><li><p>条件表达式</p><p>不知道大家是否有在使用过程中遇到以下困惑</p><ul><li>Arthas 似乎很难区分出重载的方法</li><li>我只需要观察特定参数,但是 tt 却全部都给我记录了下来</li></ul><p>条件表达式也是用 <code>OGNL</code> 来编写,核心的判断对象依然是 <code>Advice</code> 对象。除了 <code>tt</code> 命令之外,<code>watch</code><code>trace</code><code>stack</code> 命令也都支持条件表达式。</p></li><li><p>解决方法重载</p><p><code>tt -t *Test print params.length==1</code></p><p>通过制定参数个数的形式解决不同的方法签名,如果参数个数一样,你还可以这样写</p><p><code>tt -t *Test print &#39;params[1] instanceof Integer&#39;</code></p></li><li><p>解决指定参数</p><p><code>tt -t *Test print params[0].mobile==&quot;13989838402&quot;</code></p></li><li><p>构成条件表达式的 <code>Advice</code> 对象</p><p>前边看到了很多条件表达式中,都使用了 <code>params[0]</code>,有关这个变量的介绍,请参考<a href="/doc/advice-class.html" class="">表达式核心变量</a></p></li></ul><h3 id="检索调用记录" tabindex="-1"><a class="header-anchor" href="#检索调用记录" aria-hidden="true">#</a> 检索调用记录</h3><p>当你用 <code>tt</code> 记录了一大片的时间片段之后,你希望能从中筛选出自己需要的时间片段,这个时候你就需要对现有记录进行检索。</p><p>假设我们有这些记录</p><div class="language-bash ext-sh line-numbers-mode"><pre class="language-bash"><code>$ tt <span class="token parameter variable">-l</span>
INDEX TIMESTAMP COST<span class="token punctuation">(</span>ms<span class="token punctuation">)</span> IS-RET IS-EXP OBJECT CLASS METHOD
-------------------------------------------------------------------------------------------------------------------------------------
<span class="token number">1000</span> <span class="token number">2018</span>-12-04 <span class="token number">11</span>:15:38 <span class="token number">1.096236</span> <span class="token boolean">false</span> <span class="token boolean">true</span> 0x4b67cf4d MathGame primeFactors
<span class="token number">1001</span> <span class="token number">2018</span>-12-04 <span class="token number">11</span>:15:39 <span class="token number">0.191848</span> <span class="token boolean">false</span> <span class="token boolean">true</span> 0x4b67cf4d MathGame primeFactors
<span class="token number">1002</span> <span class="token number">2018</span>-12-04 <span class="token number">11</span>:15:40 <span class="token number">0.069523</span> <span class="token boolean">false</span> <span class="token boolean">true</span> 0x4b67cf4d MathGame primeFactors
<span class="token number">1003</span> <span class="token number">2018</span>-12-04 <span class="token number">11</span>:15:41 <span class="token number">0.186073</span> <span class="token boolean">false</span> <span class="token boolean">true</span> 0x4b67cf4d MathGame primeFactors
<span class="token number">1004</span> <span class="token number">2018</span>-12-04 <span class="token number">11</span>:15:42 <span class="token number">17.76437</span> <span class="token boolean">true</span> <span class="token boolean">false</span> 0x4b67cf4d MathGame primeFactors
<span class="token number">9</span>
<span class="token number">1005</span> <span class="token number">2018</span>-12-04 <span class="token number">11</span>:15:43 <span class="token number">0.4776</span> <span class="token boolean">false</span> <span class="token boolean">true</span> 0x4b67cf4d MathGame primeFactors
Affect<span class="token punctuation">(</span>row-cnt:6<span class="token punctuation">)</span> cost <span class="token keyword">in</span> <span class="token number">4</span> ms.
3 years ago
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>我需要筛选出 <code>primeFactors</code> 方法的调用信息</p><div class="language-bash ext-sh line-numbers-mode"><pre class="language-bash"><code>$ tt <span class="token parameter variable">-s</span> <span class="token string">&#39;method.name==&quot;primeFactors&quot;&#39;</span>
INDEX TIMESTAMP COST<span class="token punctuation">(</span>ms<span class="token punctuation">)</span> IS-RET IS-EXP OBJECT CLASS METHOD
-------------------------------------------------------------------------------------------------------------------------------------
<span class="token number">1000</span> <span class="token number">2018</span>-12-04 <span class="token number">11</span>:15:38 <span class="token number">1.096236</span> <span class="token boolean">false</span> <span class="token boolean">true</span> 0x4b67cf4d MathGame primeFactors
<span class="token number">1001</span> <span class="token number">2018</span>-12-04 <span class="token number">11</span>:15:39 <span class="token number">0.191848</span> <span class="token boolean">false</span> <span class="token boolean">true</span> 0x4b67cf4d MathGame primeFactors
<span class="token number">1002</span> <span class="token number">2018</span>-12-04 <span class="token number">11</span>:15:40 <span class="token number">0.069523</span> <span class="token boolean">false</span> <span class="token boolean">true</span> 0x4b67cf4d MathGame primeFactors
<span class="token number">1003</span> <span class="token number">2018</span>-12-04 <span class="token number">11</span>:15:41 <span class="token number">0.186073</span> <span class="token boolean">false</span> <span class="token boolean">true</span> 0x4b67cf4d MathGame primeFactors
<span class="token number">1004</span> <span class="token number">2018</span>-12-04 <span class="token number">11</span>:15:42 <span class="token number">17.76437</span> <span class="token boolean">true</span> <span class="token boolean">false</span> 0x4b67cf4d MathGame primeFactors
<span class="token number">9</span>
<span class="token number">1005</span> <span class="token number">2018</span>-12-04 <span class="token number">11</span>:15:43 <span class="token number">0.4776</span> <span class="token boolean">false</span> <span class="token boolean">true</span> 0x4b67cf4d MathGame primeFactors
Affect<span class="token punctuation">(</span>row-cnt:6<span class="token punctuation">)</span> cost <span class="token keyword">in</span> <span class="token number">607</span> ms.
3 years ago
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>你需要一个 <code>-s</code> 参数。<span style="color:red;">同样的,搜索表达式的核心对象依旧是 <code>Advice</code> 对象。</span></p><h3 id="查看调用信息" tabindex="-1"><a class="header-anchor" href="#查看调用信息" aria-hidden="true">#</a> 查看调用信息</h3><p>对于具体一个时间片的信息而言,你可以通过 <code>-i</code> 参数后边跟着对应的 <code>INDEX</code> 编号查看到他的详细信息。</p><div class="language-bash ext-sh line-numbers-mode"><pre class="language-bash"><code>$ tt <span class="token parameter variable">-i</span> <span class="token number">1003</span>
INDEX <span class="token number">1003</span>
GMT-CREATE <span class="token number">2018</span>-12-04 <span class="token number">11</span>:15:41
COST<span class="token punctuation">(</span>ms<span class="token punctuation">)</span> <span class="token number">0.186073</span>
OBJECT 0x4b67cf4d
CLASS demo.MathGame
METHOD primeFactors
IS-RETURN <span class="token boolean">false</span>
IS-EXCEPTION <span class="token boolean">true</span>
PARAMETERS<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> @Integer<span class="token punctuation">[</span>-564322413<span class="token punctuation">]</span>
THROW-EXCEPTION java.lang.IllegalArgumentException: number is: -564322413, need <span class="token operator">&gt;=</span> <span class="token number">2</span>
at demo.MathGame.primeFactors<span class="token punctuation">(</span>MathGame.java:46<span class="token punctuation">)</span>
at demo.MathGame.run<span class="token punctuation">(</span>MathGame.java:24<span class="token punctuation">)</span>
at demo.MathGame.main<span class="token punctuation">(</span>MathGame.java:16<span class="token punctuation">)</span>
Affect<span class="token punctuation">(</span>row-cnt:1<span class="token punctuation">)</span> cost <span class="token keyword">in</span> <span class="token number">11</span> ms.
3 years ago
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="重做一次调用" tabindex="-1"><a class="header-anchor" href="#重做一次调用" aria-hidden="true">#</a> 重做一次调用</h3><p>当你稍稍做了一些调整之后,你可能需要前端系统重新触发一次你的调用,此时得求爷爷告奶奶的需要前端配合联调的同学再次发起一次调用。而有些场景下,这个调用不是这么好触发的。</p><p><code>tt</code> 命令由于保存了当时调用的所有现场信息,所以我们可以自己主动对一个 <code>INDEX</code> 编号的时间片自主发起一次调用,从而解放你的沟通成本。此时你需要 <code>-p</code> 参数。通过 <code>--replay-times</code> 指定 调用次数,通过 <code>--replay-interval</code> 指定多次调用间隔(单位 ms, 默认 1000ms)</p><div class="language-bash ext-sh line-numbers-mode"><pre class="language-bash"><code>$ tt <span class="token parameter variable">-i</span> <span class="token number">1004</span> <span class="token parameter variable">-p</span>
RE-INDEX <span class="token number">1004</span>
GMT-REPLAY <span class="token number">2018</span>-12-04 <span class="token number">11</span>:26:00
OBJECT 0x4b67cf4d
CLASS demo.MathGame
METHOD primeFactors
PARAMETERS<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> @Integer<span class="token punctuation">[</span><span class="token number">946738738</span><span class="token punctuation">]</span>
IS-RETURN <span class="token boolean">true</span>
IS-EXCEPTION <span class="token boolean">false</span>
COST<span class="token punctuation">(</span>ms<span class="token punctuation">)</span> <span class="token number">0.186073</span>
RETURN-OBJ @ArrayList<span class="token punctuation">[</span>
@Integer<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span>,
@Integer<span class="token punctuation">[</span><span class="token number">11</span><span class="token punctuation">]</span>,
@Integer<span class="token punctuation">[</span><span class="token number">17</span><span class="token punctuation">]</span>,
@Integer<span class="token punctuation">[</span><span class="token number">2531387</span><span class="token punctuation">]</span>,
<span class="token punctuation">]</span>
Time fragment<span class="token punctuation">[</span><span class="token number">1004</span><span class="token punctuation">]</span> successfully replayed.
Affect<span class="token punctuation">(</span>row-cnt:1<span class="token punctuation">)</span> cost <span class="token keyword">in</span> <span class="token number">14</span> ms.
3 years ago
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>你会发现结果虽然一样,但调用的路径发生了变化,由原来的程序发起变成了 Arthas 自己的内部线程发起的调用了。</p><h3 id="观察表达式" tabindex="-1"><a class="header-anchor" href="#观察表达式" aria-hidden="true">#</a> 观察表达式</h3><p><code>-w, --watch-express</code> 观察时空隧道使用<code>ognl</code> 表达式</p><ul><li>使用<a href="/doc/advice-class.html" class="">表达式核心变量</a>中所有变量作为已知条件编写表达式。</li></ul><div class="language-bash ext-sh line-numbers-mode"><pre class="language-bash"><code><span class="token punctuation">[</span>arthas@10718<span class="token punctuation">]</span>$ tt <span class="token parameter variable">-t</span> demo.MathGame run <span class="token parameter variable">-n</span> <span class="token number">5</span>
Press Q or Ctrl+C to abort.
Affect<span class="token punctuation">(</span>class count: <span class="token number">1</span> , method count: <span class="token number">1</span><span class="token punctuation">)</span> cost <span class="token keyword">in</span> <span class="token number">56</span> ms, listenerId: <span class="token number">1</span>
INDEX TIMESTAMP COST<span class="token punctuation">(</span>ms<span class="token punctuation">)</span> IS-RET IS-EXP OBJECT CLASS METHOD
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
<span class="token number">1000</span> <span class="token number">2021</span>-01-08 <span class="token number">21</span>:54:17 <span class="token number">0.901091</span> <span class="token boolean">true</span> <span class="token boolean">false</span> 0x7699a589 MathGame run
3 years ago
<span class="token punctuation">[</span>arthas@10718<span class="token punctuation">]</span>$ tt <span class="token parameter variable">-w</span> <span class="token string">&#39;target.illegalArgumentCount&#39;</span> <span class="token parameter variable">-x</span> <span class="token number">1</span> <span class="token parameter variable">-i</span> <span class="token number">1000</span>
@Integer<span class="token punctuation">[</span><span class="token number">60</span><span class="token punctuation">]</span>
Affect<span class="token punctuation">(</span>row-cnt:1<span class="token punctuation">)</span> cost <span class="token keyword">in</span> <span class="token number">7</span> ms.
3 years ago
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul><li>获取类的静态字段、调用类的静态方法</li></ul><div class="language-bash ext-sh line-numbers-mode"><pre class="language-bash"><code><span class="token punctuation">[</span>arthas@10718<span class="token punctuation">]</span>$ tt <span class="token parameter variable">-t</span> demo.MathGame run <span class="token parameter variable">-n</span> <span class="token number">5</span>
Press Q or Ctrl+C to abort.
Affect<span class="token punctuation">(</span>class count: <span class="token number">1</span> , method count: <span class="token number">1</span><span class="token punctuation">)</span> cost <span class="token keyword">in</span> <span class="token number">56</span> ms, listenerId: <span class="token number">1</span>
INDEX TIMESTAMP COST<span class="token punctuation">(</span>ms<span class="token punctuation">)</span> IS-RET IS-EXP OBJECT CLASS METHOD
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
<span class="token number">1000</span> <span class="token number">2021</span>-01-08 <span class="token number">21</span>:54:17 <span class="token number">0.901091</span> <span class="token boolean">true</span> <span class="token boolean">false</span> 0x7699a589 MathGame run
3 years ago
<span class="token punctuation">[</span>arthas@10718<span class="token punctuation">]</span>$ tt <span class="token parameter variable">-w</span> <span class="token string">&#39;@demo.MathGame@random.nextInt(100)&#39;</span> <span class="token parameter variable">-x</span> <span class="token number">1</span> <span class="token parameter variable">-i</span> <span class="token number">1000</span>
@Integer<span class="token punctuation">[</span><span class="token number">46</span><span class="token punctuation">]</span>
1 year ago
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>注意这里使用 <code>com.taobao.arthas.core.advisor.Advice#getLoader</code>加载,使用精确<code>classloader</code> <a href="/doc/ognl.html" class="">ognl</a>更好。</p><p>高级用法 <a href="https://github.com/alibaba/arthas/issues/482" target="_blank" rel="noopener noreferrer">获取 spring context 调用 bean 方法<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">在新窗口打开</span></span></a></p><ul><li><p>需要强调的点</p><ol><li><p><strong>ThreadLocal 信息丢失</strong></p><p>很多框架偷偷的将一些环境变量信息塞到了发起调用线程的 ThreadLocal 中,由于调用线程发生了变化,这些 ThreadLocal 线程信息无法通过 Arthas 保存,所以这些信息将会丢失。</p><p>一些常见的 CASE 比如:鹰眼的 TraceId 等。</p></li><li><p><strong>引用的对象</strong></p><p>需要强调的是,<code>tt</code> 命令是将当前环境的对象引用保存起来,但仅仅也只能保存一个引用而已。如果方法内部对入参进行了变更,或者返回的对象经过了后续的处理,那么在 <code>tt</code> 查看的时候将无法看到当时最准确的值。这也是为什么 <code>watch</code> 命令存在的意义。</p></li></ol></li></ul><h3 id="通过索引删除指定的-tt-记录" tabindex="-1"><a class="header-anchor" href="#通过索引删除指定的-tt-记录" aria-hidden="true">#</a> 通过索引删除指定的 tt 记录</h3><div class="language-text ext-text line-numbers-mode"><pre class="language-text"><code>tt -d 1001
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><h3 id="清除所有的-tt-记录" tabindex="-1"><a class="header-anchor" href="#清除所有的-tt-记录" aria-hidden="true">#</a> 清除所有的 tt 记录</h3><div class="language-text ext-text line-numbers-mode"><pre class="language-text"><code>tt --delete-all
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div></div><!--[--><!--]--></div><footer class="page-meta right-menu-padding" data-v-fdd717e0><div class="meta-item edit-link"><a class="external-link meta-item-label" href="https://github.com/alibaba/arthas/edit/master/site/docs/doc/tt.md" rel="noopener noreferrer" target="_blank" aria-label="在 GitHub 上编辑此页"><!--[--><!--]--><span>在 GitHub 上编辑此页</span><span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">在新窗口打开</span></span><!--[--><!--]--></a></div><div class="meta-item last-updated"><span class="meta-item-label">Last Updated: </span><!----></div><div class="meta-item contributors"><span class="meta-item-label">贡献者: </span><span class="meta-item-info"><!--[--><!--[--><span class="contributor" title="email: hengyunabc@gmail.com">hengyunabc</span><!--[-->, <!--]--><!--]--><!--[--><span class="contributor" title="email: hengyunabc@users.noreply.github.com">hengyunabc</span><!--[-->, <!--]--><!--]--><!--[--><span class="contributor" title="email: superheizai@aliyun.com">superheizai</span><!--[-->, <!--]--><!--]--><!--[--><span class="contributor" title="email: i@fatpandac.com">Fatpandac</span><!--[-->, <!--]--><!--]--><!--[--><span class="contributor" title="email: 35672972+pandaapo@users.noreply.github.com">pandaapo</span><!--[-->, <!--]--><!--]--><!--[--><span class="contributor" title="email: hollowman186@vip.qq.com">Hollow Man</span><!--[-->, <!--]--><!--]--><!--[--><span class="contributor" title="email: xiangmz0928@gmail.com">Xiangmingzhe</span><!--[-->, <!--]--><!--]--><!--[--><span class="contributor" title="email: snipercy@users.noreply.github.com">vic</span><!--[-->, <!--]--><!--]--><!--[--><span class="contributor" title="email: 983433479@qq.com">汪吉</span><!----><!--]--><!--]--></span></div></footer><nav class="page-nav right-menu-padding" data-v-fdd717e0><p class="inner"><span class="prev"><a href="/doc/trace.html" class="" aria-label="trace"><!--[--><!--]--> trace <!--[--><!--]--></a></span><span class="next"><a href="/doc/version.html" class="" aria-label="version"><!--[--><!--]--> version <!--[--><!--]--></a></span></p></nav><!--[--><!--]--></main><!--]--></div><!----><!--]--></div>
<script type="module" src="/assets/app.5e87b7e3.js" defer></script>
</body>
</html>