mirror of
https://github.com/zhwei820/learn.lianglianglee.com.git
synced 2025-11-04 00:03:54 +08:00
fix img
This commit is contained in:
@@ -289,7 +289,7 @@ May 21 12:05:23 web1 kernel: CPU: 2 PID: 10467 Comm: jstatd Not tainted 3.10.0-5
|
||||
<li><a href="https://github.com/btraceio/btrace/releases/download/v2.0.0/btrace-bin.zip">btrace-bin.zip</a></li>
|
||||
</ul>
|
||||
<p>下载完成后解压即可使用:</p>
|
||||
<p><img src="assets/b12ba340-7808-11ea-b264-6326f7cc0e82" alt="1613271.png" /></p>
|
||||
<p><img src="assets/b12ba340-7808-11ea-b264-6326f7cc0e82" alt="png" /></p>
|
||||
<p>可以看到,bin 目录下是可执行文件,samples 目录下是脚本示例。</p>
|
||||
<h4><strong>示例程序</strong></h4>
|
||||
<p>我们先编写一个有入参有返回值的方法,示例如下:</p>
|
||||
@@ -325,25 +325,25 @@ public class RandomSample {
|
||||
<p>细心的同学可能已经发现,在安装 JVisualVM 的插件时,有一款插件叫做“BTrace Workbench”。安装这款插件之后,在对应的 JVM 实例上点右键,就可以进入 BTrace 的操作界面。</p>
|
||||
<p><strong>1. BTrace 插件安装</strong></p>
|
||||
<p>打开 VisualVM,选择菜单“工具–插件(G)”:</p>
|
||||
<p><img src="assets/d59e3c10-7808-11ea-8c74-b966eb0a8d67" alt="82699966.png" /></p>
|
||||
<p><img src="assets/d59e3c10-7808-11ea-8c74-b966eb0a8d67" alt="png" /></p>
|
||||
<p>然后在插件安装界面中,找到“可用插件”:</p>
|
||||
<p><img src="assets/0665b8f0-7809-11ea-8e11-89f2c26dd0be" alt="82770532.png" /></p>
|
||||
<p><img src="assets/0665b8f0-7809-11ea-8e11-89f2c26dd0be" alt="png" /></p>
|
||||
<p>勾选“BTrace Workbench”之后,点击“安装(I)”按钮。</p>
|
||||
<blockquote>
|
||||
<p>如果插件不显示,请更新 JDK 到最新版。</p>
|
||||
</blockquote>
|
||||
<p><img src="assets/3661cf80-7809-11ea-a98c-83821ebf98cb" alt="82937996.png" /></p>
|
||||
<p><img src="assets/3661cf80-7809-11ea-a98c-83821ebf98cb" alt="png" /></p>
|
||||
<p>按照引导和提示,继续安装即可。</p>
|
||||
<p><img src="assets/4aa27120-7809-11ea-86cb-4dea263d5534" alt="82991766.png" /></p>
|
||||
<p><img src="assets/4aa27120-7809-11ea-86cb-4dea263d5534" alt="png" /></p>
|
||||
<p>接受协议,并点击安装。</p>
|
||||
<p><img src="assets/53216e00-7809-11ea-b61a-45f5a80e7f1b" alt="83219940.png" /></p>
|
||||
<p><img src="assets/53216e00-7809-11ea-b61a-45f5a80e7f1b" alt="png" /></p>
|
||||
<p>等待安装完成:</p>
|
||||
<p><img src="assets/5c553bf0-7809-11ea-8e11-89f2c26dd0be" alt="83257210.png" /></p>
|
||||
<p><img src="assets/5c553bf0-7809-11ea-8e11-89f2c26dd0be" alt="png" /></p>
|
||||
<p>点击“完成”按钮即可。</p>
|
||||
<p><strong>BTrace 插件使用</strong></p>
|
||||
<p><img src="assets/689845b0-7809-11ea-8856-57a8f16560a7" alt="85267702.png" /></p>
|
||||
<p><img src="assets/689845b0-7809-11ea-8856-57a8f16560a7" alt="png" /></p>
|
||||
<p>打开后默认的界面如下:</p>
|
||||
<p><img src="assets/70515a80-7809-11ea-8e11-89f2c26dd0be" alt="85419826.png" /></p>
|
||||
<p><img src="assets/70515a80-7809-11ea-8e11-89f2c26dd0be" alt="png" /></p>
|
||||
<p>可以看到这是一个 Java 文件的样子。然后我们参考官方文档,加一些脚本进去。</p>
|
||||
<h4><strong>BTrace 脚本示例</strong></h4>
|
||||
<p>我们下载的 BTrace 项目中,samples 目录下有一些脚本示例。 参照这些示例,编写一个简单的 BTrace 脚本:</p>
|
||||
@@ -380,7 +380,7 @@ public class TracingScript {
|
||||
</code></pre>
|
||||
<h4><strong>执行结果</strong></h4>
|
||||
<p>可以看到,输出了简单的执行结果:</p>
|
||||
<p><img src="assets/60607910-780b-11ea-8e11-89f2c26dd0be" alt="6182718.png" /></p>
|
||||
<p><img src="assets/60607910-780b-11ea-8e11-89f2c26dd0be" alt="png" /></p>
|
||||
<p>可以和示例程序的控制台输出比对一下。</p>
|
||||
<h4><strong>更多示例</strong></h4>
|
||||
<p>BTrace 提供了很多示例,照着改一改就能执行简单的监控。</p>
|
||||
@@ -443,9 +443,9 @@ java -jar arthas-boot.jar
|
||||
</code></pre>
|
||||
<h4>使用示例</h4>
|
||||
<p>启动之后显示的信息大致如下图所示:</p>
|
||||
<p><img src="assets/94b56270-780b-11ea-a3f1-b7b0a6636d71" alt="8128798.png" /></p>
|
||||
<p><img src="assets/94b56270-780b-11ea-a3f1-b7b0a6636d71" alt="png" /></p>
|
||||
<p>然后我们输入需要连接(Attach)的 JVM 进程,例如 1,然后回车。</p>
|
||||
<p><img src="assets/a10febd0-780b-11ea-a3f1-b7b0a6636d71" alt="8296362.png" /></p>
|
||||
<p><img src="assets/a10febd0-780b-11ea-a3f1-b7b0a6636d71" alt="png" /></p>
|
||||
<p>如果需要退出,输入 exit 即可。</p>
|
||||
<p>接着我们输入 help 命令查看帮助,返回的信息大致如下。</p>
|
||||
<pre><code>[<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="751407011d1406354742464045">[email protected]</a>]$ help
|
||||
@@ -492,11 +492,11 @@ java -jar arthas-boot.jar
|
||||
<pre><code>help thread
|
||||
</code></pre>
|
||||
<p>如果查看 JVM 信息,输入命令 jvm 即可。</p>
|
||||
<p><img src="assets/ab1588b0-780b-11ea-b760-29671afaaa1a" alt="8871310.png" /></p>
|
||||
<p><img src="assets/ab1588b0-780b-11ea-b760-29671afaaa1a" alt="png" /></p>
|
||||
<p>环境变量 sysenv:</p>
|
||||
<p><img src="assets/b2e1d760-780b-11ea-8856-57a8f16560a7" alt="9257854.png" /></p>
|
||||
<p><img src="assets/b2e1d760-780b-11ea-8856-57a8f16560a7" alt="png" /></p>
|
||||
<p>查看线程信息,输入命令 thread:</p>
|
||||
<p><img src="assets/bae2a390-780b-11ea-b61a-45f5a80e7f1b" alt="8831103.png" /></p>
|
||||
<p><img src="assets/bae2a390-780b-11ea-b61a-45f5a80e7f1b" alt="png" /></p>
|
||||
<p>查看某个线程的信息:</p>
|
||||
<pre><code>[<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f8998a8c90998bb8cacfcbcdc8">[email protected]</a>]$ thread 1
|
||||
"main" Id=1 TIMED_WAITING
|
||||
@@ -506,18 +506,18 @@ java -jar arthas-boot.jar
|
||||
at demo.jvm0209.RandomSample.main(Unknown Source)
|
||||
</code></pre>
|
||||
<p>查看 JVM 选项 vmoption:</p>
|
||||
<p><img src="assets/c3a51210-780b-11ea-8e11-89f2c26dd0be" alt="9104344.png" /></p>
|
||||
<p><img src="assets/c3a51210-780b-11ea-8e11-89f2c26dd0be" alt="png" /></p>
|
||||
<p>某些选项可以设置,这里给出了示例 <code>vmoption PrintGCDetails true</code>。</p>
|
||||
<p>查找类 sc:</p>
|
||||
<p><img src="assets/7c81e650-780c-11ea-a89b-47a48ccffebe" alt="9474443.png" /></p>
|
||||
<p><img src="assets/7c81e650-780c-11ea-a89b-47a48ccffebe" alt="png" /></p>
|
||||
<p>反编译代码 jad:</p>
|
||||
<p><img src="assets/8ec49510-780c-11ea-8c74-b966eb0a8d67" alt="9593919.png" /></p>
|
||||
<p><img src="assets/8ec49510-780c-11ea-8c74-b966eb0a8d67" alt="png" /></p>
|
||||
<p>堆内存转储 heapdump:</p>
|
||||
<p><img src="assets/85d59850-780c-11ea-b760-29671afaaa1a" alt="9834789.png" /></p>
|
||||
<p><img src="assets/85d59850-780c-11ea-b760-29671afaaa1a" alt="png" /></p>
|
||||
<p>跟踪方法执行时间 trace:</p>
|
||||
<p><img src="assets/976068c0-780c-11ea-a98c-83821ebf98cb" alt="9997095.png" /></p>
|
||||
<p><img src="assets/976068c0-780c-11ea-a98c-83821ebf98cb" alt="png" /></p>
|
||||
<p>观察方法执行 watch:</p>
|
||||
<p><img src="assets/9e27a380-780c-11ea-9105-57164a9a27ea" alt="10270279.png" /></p>
|
||||
<p><img src="assets/9e27a380-780c-11ea-9105-57164a9a27ea" alt="png" /></p>
|
||||
<p>可以看到,支持条件表达式,类似于代码调试中的条件断点。 功能非常强大,并且作为一个 JVM 分析的集成环境,使用起来也比一般工具方便。更多功能请参考 <a href="https://alibaba.github.io/arthas/">Arthas 用户文档</a>。</p>
|
||||
<h3>抽样分析器(Profilers)</h3>
|
||||
<p>下面介绍分析器(<a href="http://zeroturnaround.com/rebellabs/developer-productivity-report-2015-java-performance-survey-results/3/">profilers</a>,Oracle 官方翻译是“抽样器”)。</p>
|
||||
@@ -570,11 +570,11 @@ java -jar arthas-boot.jar
|
||||
<li>让程序运行一段时间,以收集关于对象分配的足够信息。</li>
|
||||
<li>单击下方的“Snapshot”(快照)按钮,可以获取收集到的快照信息。</li>
|
||||
</ol>
|
||||
<p><img src="assets/f4c62b30-780c-11ea-b264-6326f7cc0e82" alt="85731ea7-1c8c-4f9a-8869-bd25f61e3300.png" /></p>
|
||||
<p><img src="assets/f4c62b30-780c-11ea-b264-6326f7cc0e82" alt="png" /></p>
|
||||
<p>完成上面的步骤后,可以得到类似这样的信息:</p>
|
||||
<p><img src="assets/fcd5eb80-780c-11ea-9105-57164a9a27ea" alt="f6c5d90d-104f-474e-b9fe-fa4d351871da.png" /></p>
|
||||
<p><img src="assets/fcd5eb80-780c-11ea-9105-57164a9a27ea" alt="png" /></p>
|
||||
<p>上图按照每个类被创建的对象数量多少来排序。看第一行可以知道,创建的最多的对象是 int[] 数组。鼠标右键单击这行,就可以看到这些对象都在哪些地方创建的:</p>
|
||||
<p><img src="assets/05cc1430-780d-11ea-8856-57a8f16560a7" alt="e9583002-b04a-4a2c-8e94-3c9e0e57557a.png" /></p>
|
||||
<p><img src="assets/05cc1430-780d-11ea-8856-57a8f16560a7" alt="png" /></p>
|
||||
<p>与 hprof 相比,JVisualVM 更加容易使用 —— 比如上面的截图中,在一个地方就可以看到所有 int[] 的分配信息,所以多次在同一处代码进行分配的情况就很容易发现。</p>
|
||||
<h4><strong>AProf</strong></h4>
|
||||
<p>AProf 是一款重要的分析器,是由 Devexperts 开发的 <strong>AProf</strong>。内存分配分析器 AProf 也被打包为 Java agent 的形式。</p>
|
||||
|
||||
Reference in New Issue
Block a user