更换图片源
This commit is contained in:
parent
56a3901e3c
commit
fb749ac8ff
@ -31,12 +31,12 @@ JConsole(Java Monitoring and Management Console)是一款基于 JMX(Java M
|
||||
|
||||
打开位于 bin 目录下的 `jconsole` 程序后,它会自动扫描当前主机上的所有 JVM 进程:
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jconsole-start.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jconsole-start.png"/> </div>
|
||||
|
||||
|
||||
选中需要监控的进程后,点击连接,即可进入监控界面。监控界面包含了 *概览*、*内存*、*线程*、*类*、*VM 概要*、*MBean* 六个选项卡。其中概览界面显示的是 *内存*、*线程*、*类* 等三个选项卡界面的概览信息,如下所示:
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jconsole-概览.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jconsole-概览.png"/> </div>
|
||||
|
||||
|
||||
|
||||
@ -45,7 +45,7 @@ JConsole(Java Monitoring and Management Console)是一款基于 JMX(Java M
|
||||
|
||||
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jconsole-内存.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jconsole-内存.png"/> </div>
|
||||
|
||||
|
||||
|
||||
@ -54,14 +54,14 @@ JConsole(Java Monitoring and Management Console)是一款基于 JMX(Java M
|
||||
|
||||
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jconsole-检测死锁.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jconsole-检测死锁.png"/> </div>
|
||||
|
||||
|
||||
|
||||
|
||||
点击死锁选项卡则可以看到造成死锁的线程:
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jconsole-死锁.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jconsole-死锁.png"/> </div>
|
||||
|
||||
|
||||
|
||||
@ -70,7 +70,7 @@ JConsole(Java Monitoring and Management Console)是一款基于 JMX(Java M
|
||||
|
||||
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jconsole-概要.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jconsole-概要.png"/> </div>
|
||||
|
||||
|
||||
|
||||
@ -91,7 +91,7 @@ VisualVM(All-in-One Java Troubleshooting Tool)是 Oracle 提供的功能最
|
||||
|
||||
打开位于 bin 目录下的 `jvisualvm` 程序, 它会自动扫描当前主机上的所有 JVM 进程:
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jvisual.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jvisual.png"/> </div>
|
||||
|
||||
|
||||
|
||||
@ -100,7 +100,7 @@ VisualVM(All-in-One Java Troubleshooting Tool)是 Oracle 提供的功能最
|
||||
|
||||
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jvisual-监视.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jvisual-监视.png"/> </div>
|
||||
|
||||
|
||||
|
||||
@ -111,7 +111,7 @@ VisualVM(All-in-One Java Troubleshooting Tool)是 Oracle 提供的功能最
|
||||
|
||||
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jvisual-堆dump.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jvisual-堆dump.png"/> </div>
|
||||
|
||||
|
||||
|
||||
@ -120,7 +120,7 @@ VisualVM(All-in-One Java Troubleshooting Tool)是 Oracle 提供的功能最
|
||||
|
||||
在线程界面可以查看所有线程的状态,如果出现死锁,该界面还会进行提示:
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jvisual-线程.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jvisual-线程.png"/> </div>
|
||||
|
||||
|
||||
|
||||
@ -129,7 +129,7 @@ VisualVM(All-in-One Java Troubleshooting Tool)是 Oracle 提供的功能最
|
||||
|
||||
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jvisual-dump.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jvisual-dump.png"/> </div>
|
||||
|
||||
|
||||
|
||||
@ -138,7 +138,7 @@ VisualVM(All-in-One Java Troubleshooting Tool)是 Oracle 提供的功能最
|
||||
|
||||
在 Profiler 界面,可以进行 CPU 和 内存的性能分析。要开始性能分析,需要先选择 **CPU** 或 **内存** 按钮中的一个,VisualVM 将会开始记录应用程序执行过的所有方法:如果是进行的是 CPU 执行时间分析,将会统计每个方法的执行次数、执行耗时;如果是内存分析,则会统计每个方法关联的对象数以及这些对象所占的空间。想要结束性能分析,点击停止按钮即可:
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jvisual-性能分析.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jvisual-性能分析.png"/> </div>
|
||||
|
||||
|
||||
|
||||
@ -147,7 +147,7 @@ VisualVM(All-in-One Java Troubleshooting Tool)是 Oracle 提供的功能最
|
||||
|
||||
Visual GC 面板默认是不显示的,需要通过插件进行扩展。它会实时监控虚拟机的状态,在功能上类似于 jstat 命令:
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jvisual-gc.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jvisual-gc.png"/> </div>
|
||||
|
||||
|
||||
|
||||
@ -156,7 +156,7 @@ Visual GC 面板默认是不显示的,需要通过插件进行扩展。它会
|
||||
|
||||
在主界面,点击 **工具 => 插件** ,可以打开插件面板。右击插件选项或者点击安装按钮即可完成对应插件的安装:
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jvisual-插件安装.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jvisual-插件安装.png"/> </div>
|
||||
|
||||
|
||||
|
||||
@ -165,7 +165,7 @@ Visual GC 面板默认是不显示的,需要通过插件进行扩展。它会
|
||||
|
||||
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jvisual-插件中心.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jvisual-插件中心.png"/> </div>
|
||||
|
||||
|
||||
|
||||
@ -174,7 +174,7 @@ Visual GC 面板默认是不显示的,需要通过插件进行扩展。它会
|
||||
|
||||
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jvisual-配置插件中心.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jvisual-配置插件中心.png"/> </div>
|
||||
|
||||
|
||||
|
||||
@ -232,7 +232,7 @@ chown root:root /usr/local/jmxremote.password
|
||||
|
||||
之后在使用 VisualVM 进行远程连接时,配置如下:
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jvisual-连接远程主机.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jvisual-连接远程主机.png"/> </div>
|
||||
|
||||
|
||||
需要注意的是这里的端口号是配置的 `Dcom.sun.management.jmxremote.port` 的值,而不是 Java 程序的端口号。连接完成后,即可查看到对应进程的监控状态。
|
||||
|
@ -22,7 +22,7 @@
|
||||
jps(JVM Process Status Tool)用于列出正在运行的虚拟机进程的主类名称和 LVMID(Local Virtual Machine Identifier,本地虚拟机唯一标识),这里得到的 LVMID 是进行后续其它查询的基础。示例如下:
|
||||
|
||||
```shell
|
||||
C:\Users>jps
|
||||
C:/Users>jps
|
||||
10848 Main
|
||||
14560 Jps
|
||||
7040 Launcher
|
||||
@ -65,7 +65,7 @@ jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
|
||||
jstat -gc 9492 3s 5 # 每3s输出一次,一共输出5次
|
||||
```
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jstat_gc.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jstat_gc.png"/> </div>
|
||||
|
||||
|
||||
输出信息中各个参数含义分别如下:
|
||||
@ -115,7 +115,7 @@ jinfo -flags 13604
|
||||
jinfo -flag CMSInitiatingOccupancyFraction 13604
|
||||
```
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jinfo.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jinfo.png"/> </div>
|
||||
|
||||
|
||||
|
||||
@ -145,7 +145,7 @@ jmap [option] <pid>
|
||||
jmap -dump:format=b,file=test.bin 3260
|
||||
```
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jmap.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jmap.png"/> </div>
|
||||
|
||||
|
||||
|
||||
@ -170,22 +170,22 @@ public class StackOverFlowTest {
|
||||
|
||||
其最终会抛出 `java.lang.OutOfMemoryError: Java heap space` 异常,意味着在 JVM 堆上发生了内存溢出。在程序运行期间,我们可以使用上面的 jmap 命令生成堆转储快照,并使用 jhat 命令进行分析:
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jhat.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jhat.png"/> </div>
|
||||
|
||||
|
||||
jhat 命令最终的分析结果会以网页的方式进行提供,端口为 7000,界面如下:
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jhat_web.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jhat_web.png"/> </div>
|
||||
|
||||
|
||||
jhat 分析的结果并不够直观,因此我们还可以借助第三方工具来分析堆转储快照,这里以 JProfiler 为例,该软件可以直接从[官网](https://www.ej-technologies.com/products/jprofiler/overview.htm)下载并安装,安装完成后,点击 `session` 选项卡,并使用 `Open Snapshot` 打开 jmap 命令生成的堆转储快照:
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jprofiler-1.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jprofiler-1.png"/> </div>
|
||||
|
||||
|
||||
之后程序会自动进行分析,分析结果如下:
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jprofiler-2.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jprofiler-2.png"/> </div>
|
||||
|
||||
|
||||
通过以上可视化的统计结果,我们就可以很快定位到导致内存溢出的原因。
|
||||
@ -250,7 +250,7 @@ jstack 8112
|
||||
|
||||
输出结果如下:
|
||||
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures\jstack.png"/> </div>
|
||||
<div align="center"> <img src="https://gitee.com/heibaiying/Full-Stack-Notes/raw/master/pictures/jstack.png"/> </div>
|
||||
|
||||
|
||||
从输出中结果中可以看出,出现了一个死锁,该死锁由线程 Thread-0 和 Thread-1 导致,原因是 Thread-0 锁住了对象 `<0x00000000d6d8d610>` ,并尝试获取 `<0x00000000d6d8d640>` 对象的锁;但是 Thread-0 却恰恰相反,锁住了对象 `<0x00000000d6d8d640>` ,并尝试获取 `<0x00000000d6d8d610>` 对象的锁,由此导致死锁。
|
||||
|
Loading…
x
Reference in New Issue
Block a user