给系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。这里说的数据包括:cpu、网络、内存、磁盘、运行日志、异常堆栈、 GC 日志、线程快照 ( threaddump/javacore 文件)、堆转储快照( heapdump/hprof 文件)等。经常使用适当的虚拟机监控和分析的工具可以加快我们分析数据、定位解决问题的速度。
1、系统工具
1.1、top
top命令用于显示所有运行和活跃的实时进程并定期更新它。它显示了cpu使用率,内存使用率,交换内存,缓存大小,缓冲区大小,进程pid,用户,命令等等。它也展示了运行进程的高cpu利用率和内存利用率。top命令对系统管理员监视和在需要的时候采取正确的行动是非常的重要。
top命令使用方法:
格式:top [-] [d] [p] [q] [c] [C] [S] [s] [n]
参数说明:
- d:指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。
- p:通过指定监控进程ID来仅仅监控某个进程的状态。
- q:该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
- S:指定累计模式。
- s:使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
- i:使top不显示任何闲置或者僵死进程。
- c:显示整个命令行而不只是显示命令名。
top的内部命令:
s – 改变画面更新频率
l – 关闭或开启第一部分第一行 top 信息的表示
t – 关闭或开启第一部分第二行 Tasks 和第三行 Cpus 信息的表示
m – 关闭或开启第一部分第四行 Mem 和 第五行 Swap 信息的表示
N – 以 PID 的大小的顺序排列表示进程列表
P – 以 CPU 占用率大小的顺序排列进程列表
M – 以内存占用率大小的顺序排列进程列表
h – 显示帮助
n – 设置在进程列表所显示进程的数量
q – 退出 top
s – 改变画面更新周期
示例1:
https://www.cnblogs.com/sunshuhai/p/6250514.html
https://www.cnblogs.com/zk47/p/4261288.html
https://www.cnblogs.com/zhoug2020/p/6336453.html
1.2、htop
htop 是Linux系统中的一个互动的进程查看器,一个文本模式的应用程序(在控制台或者X终端中),需要ncurses。与Linux传统的top相比,htop更加人性化。它可让用户交互式操作,支持颜色主题,可横向或纵向滚动浏览进程列表,并支持鼠标操作。
htop相比较top的优势:
可以横向或纵向滚动浏览进程列表,以便看到所有的进程和完整的命令行。
在启动上比top 更快。
杀进程时不需要输入进程号。
htop 支持鼠标选中操作(反应不太快)。
top 已不再维护。
示例1:
示例2:
https://www.cnblogs.com/zangfans/p/8595000.html
https://blog.csdn.net/u011327981/article/details/78201208
https://www.sogou.com/link?url=hedJjaC291NVm6BbIVBZ6EkewZMrPH_RI_FFzAicPRHyNSHDNjHtute0NqN3DoLN0ztd7q5nl6o.
1.2、vmstat
vmstat 统计虚拟内存信息,可以对操作系统的proc、memory、CPU、IO等信息进行统计以呈现给用户。
vmstat语法:
- vmstat [-a] [-n] [delay [ count]]
- vmstat [-f] [-s] [-m]
- vmstat [-S unit]
- vmstat [-d]
- vmstat [-p disk_partition]
- vmstat [-V]
参数说明:
- [ -a ] 显示 活动(active)和 非活动(inactive)的内存。
- [ -n ] 只显示头信息,不周期性显示。这里没有测试出-n的作用,貌似有和没有,结果都一样。
- [ -f ] 显示自开机以来forks的总数,包括fork、vfork和clone system calls,总数和tasks创建的数量是一致的。
- [ -s ]显示各种事件计数器表和内存统计信息,这显示不重复。
- [ -m ]显示slabinfo,好像是缓存相关的,对这个完全不懂。可以对比一下/proc/slabinfo的内容。
- [ -V ]显示版本信息。
- [ -d ]显示磁盘数据(disk statistics)
- [ -D ]显示磁盘统计表(disk table)
- [ -S 单位 ]
k:1000
K:1024 (默认为K)
m:1000000
M:1048576
比较:k和K
- [ -p 分区 ]显示磁盘分区数据(disk partition statistics )
- [ delay [ count ] ] delay是间隔,count显示多少次信息。可以和上面的某些参数结合使用。
示例1:
示例2:
https://www.cnblogs.com/chenwenbiao/archive/2011/10/26/2224733.html
https://blog.csdn.net/frankarmstrong/article/details/54313727
http://blog.chinaunix.net/uid-25505925-id-191966.html
https://www.cnblogs.com/tommyli/p/3746187.html
1.3、tcpdump
tcpdump是一个用于截取网络分组,并输出分组内容的工具。tcpdump凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具。 tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的Linux系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。
https://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html
https://www.sogou.com/link?url=DOb0bgH2eKh1ibpaMGjuy4yKaqZiSHtWC8ug8Cuw59om3Pojx-sH_OBXJDiYuRkTiYSK4ioE2I4.
https://www.cnblogs.com/maifengqiang/p/3863168.html
https://www.runoob.com/linux/linux-comm-tcpdump.html
1.4、netstat
Netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。
netstat常见参数:
- -a (all) 显示所有选项,默认不显示LISTEN相关。
- -t (tcp) 仅显示tcp相关选项。
- -u (udp) 仅显示udp相关选项。
- -n 拒绝显示别名,能显示数字的全部转化成数字。
- -l 仅列出有在 Listen (监听) 的服务状态。
- -p 显示建立相关链接的程序名
- -r 显示路由信息,路由表
- -e 显示扩展信息,例如uid等
- -s 按各个协议进行统计
- -c 每隔一个固定时间,执行该netstat命令。
LISTEN和LISTENING的状态只有用-a或者-l才能看到。
netstat网络状态详解:
一个正常的TCP连接,都会有三个阶段:1、TCP三次握手;2、数据传送;3、TCP四次挥手。
- SYN:(同步序列编号,Synchronize Sequence Numbers)该标志仅在三次握手建立TCP连接时有效。表示一个新的TCP连接请求。
- ACK:(确认编号,Acknowledgement Number)是对TCP请求的确认标志,同时提示对端系统已经成功接收所有数据。
- FIN:(结束标志,FINish)用来结束一个TCP回话.但对应端口仍处于开放状态,准备接收后续数据。
- LISTEN:首先服务端需要打开一个socket进行监听,状态为LISTEN, The socket is listening for incoming connections. 侦听来自远方TCP端口的连接请求 。
- SYN_SENT:客户端通过应用程序调用connect进行active open.于是客户端tcp发送一个SYN以请求建立一个连接,之后状态置为SYN_SENT,The socket is actively attempting to establish a connection. 在发送连接请求后等待匹配的连接请求。
- SYN_RECV:服务端应发出ACK确认客户端的SYN,同时自己向客户端发送一个SYN, 之后状态置为SYN_RECV ,
- A connection request has been received from the network. 在收到和发送一个连接请求后等待对连接请求的确认 。
- ESTABLISHED:代表一个打开的连接,双方可以进行或已经在数据交互了, The socket has an established connection. 代表一个打开的连接,数据可以传送给用户。
- FIN_WAIT1:主动关闭(active close)端应用程序调用close,于是其TCP发出FIN请求主动关闭连接,之后进入FIN_WAIT1状态。 The socket is closed, and the connection is shutting down. 等待远程TCP的连接中断请求,或先前的连接中断请求的确认。
- CLOSE_WAIT:被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序),并进入CLOSE_WAIT, The remote end has shut down, waiting for the socket to close. 等待从本地用户发来的连接中断请求 。
- FIN_WAIT2:主动关闭端接到ACK后,就进入了FIN-WAIT-2 , Connection is closed, and the socket is waiting for a shutdown from the remote end. 从远程TCP等待连接中断请求。
- LAST_ACK:被动关闭端一段时间后,接收到文件结束符的应用程序将调用CLOSE关闭连接。这导致它的TCP也发送一个 FIN,等待对方的ACK.就进入了LAST-ACK , The remote end has shut down, and the socket is closed. Waiting for acknowledgement. 等待原来发向远程TCP的连接中断请求的确认。
- TIME_WAIT:在主动关闭端接收到FIN后,TCP就发送ACK包,并进入TIME-WAIT状态。 The socket is waiting after close to handle packets still in the network.等待足够的时间以确保远程TCP接收到连接中断请求的确认。
- CLOSING:比较少见, Both sockets are shut down but we still don’t have all our data sent. 等待远程TCP对连接中断的确认。
- CLOSED: 被动关闭端在接受到ACK包后,就进入了closed的状态。连接结束, The socket is not being used. 没有任何连接状态。
- TIME_WAIT状态的形成只发生在主动关闭连接的一方。
- 主动关闭方在接收到被动关闭方的FIN请求后,发送成功给对方一个ACK后,将自己的状态由FIN_WAIT2修改为TIME_WAIT,而必须再等2倍 的MSL(Maximum Segment Lifetime,MSL是一个数据报在internetwork中能存在的时间)时间之后双方才能把状态 都改为CLOSED以关闭连接。目前RHEL里保持TIME_WAIT状态的时间为60秒。
常用netstat相关命令:
- 列出所有端口 #netstat -a
- 列出所有 tcp 端口 #netstat -at
- 列出所有 udp 端口 #netstat -au
- 只显示监听端口 #netstat -l
- 只列出所有监听 tcp 端口 #netstat -lt
- 只列出所有监听 udp 端口 #netstat -lu
- 列出所有监听 UNIX 端口 #netstat -lx
- 显示所有端口的统计信息 #netstat -s
- 显示 TCP 或 UDP 端口的统计信息 #netstat -st 或 -su
- 输出中显示 PID 和进程名称 #netstat -p
- netstat 输出中不显示主机,端口和用户名 (host, port or user),当你不想让主机,端口和用户名显示,使用 netstat -n。将会使用数字代替那些名称。同样可以加速输出,因为不用进行比对查询。
#netstat -an
如果只是不想让这三个名称中的一个被显示,使用以下命令:
# netsat -a --numeric-ports
# netsat -a --numeric-hosts
# netsat -a --numeric-users
- 持续输出 netstat 信息 #netstat -c
- 找出程序运行的端口 #netstat -ap | grep ':80'
- 查看连接某服务端口最多的的IP地址(前20个)
#netstat -nat | grep "10.1.62.23:443" |awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -20
- TCP各种状态列表
#netstat -nat |awk '{print $6}'
统计数量
#netstat -nat |awk '{print $6}'|sort|uniq -c
排序
#netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn
#netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
- 直接统计tcp数量监听的数量
示例1:
示例2:
https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316661.html
https://www.cnblogs.com/hnrainll/archive/2011/10/21/2220518.html
https://www.runoob.com/linux/linux-comm-netstat.html
https://blog.csdn.net/bit_clearoff/article/details/60876695
https://blog.csdn.net/dongl890426/article/details/86981901
1.6、iotop
iotop是top和iostat程序的混合体,能够显示系统中所有运行进程并将进程根据I/O统计信息排序。
命令格式:iotop [option]
option参数如下:
- --version://显示程序的版本号并退出
- -h, --help://显示此帮助消息并退出
- -o, --only://仅显示实际执行I / O的进程或线程,只显示在划硬盘的程序
- -b, --batch://非交互模式,批量处理 用来记录日志的
- -n NUM, --iter=NUM://设定循环几次
- -d SEC, --delay=SEC://设定显示时间间隔[秒]
- -p PID, --pid=PID://要监控的进程/线程[全部]
- -u USER, --user=USER://用户监控[全部]
- -P, --processes://只显示进程,而不是所有线程
- -a, --accumulated://显示累积的I / O而不是带宽
- -k, --kilobytes://使用千字节而不是人性化的单位
- -t, --time://在每一行上添加一个时间戳(暗示--batch)
- -q, --quiet://抑制一些标题行(暗示--batch)
交互参数:
- left和right方向键:改变排序。
- r:反向排序。
- o:切换至选项--only。
- p:切换至--processes选项。
- a:切换至--accumulated选项。
- q:退出。
- i:改变线程的优先级。
示例1:
示例2:
https://www.sogou.com/link?url=hedJjaC291OB0PrGj_c3jLEFOfDkmI-hJxdPKiK9FpKtnYliYyxL4bU6DtrNzhoz94ho9zn634AxDoYjEBjf8A..
https://www.sogou.com/link?url=DOb0bgH2eKh1ibpaMGjuy0Op75j2hrTLGVTyrn6B7UCuSdKpCMIsLvwPDbfYqoagAfB0gaj415w
https://www.cnblogs.com/momenglin/p/10268179.html.
1.7、iostat
iostat用于输出CPU和磁盘I/O相关的统计信息。
命令格式:iostat [ -c | -d ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ device [ ... ] | ALL ] [ -p [ device | ALL ] ]
[ interval [ count ] ]
参数说明:
- -c 仅显示CPU统计信息,与-d选项互斥.
- -d 仅显示磁盘统计信息,与-c选项互斥.
- -k 以K为单位显示每秒的磁盘请求数,默认单位块.
- -p device | ALL 与-x选项互斥,用于显示块设备及系统分区的统计信息.也可以在-p后指定一个设备名,如: # iostat -p hda 或显示所有设备 # iostat -p ALL
- -t 在输出数据时,打印搜集数据的时间.
- -V 打印版本号和帮助信息.
- -x 输出扩展信息.
示例1:
示例2:
https://blog.csdn.net/zhangjay/article/details/6656771
https://www.sogou.com/link?url=hedJjaC291P3yGwc7N55kLSc2ls_Ks2xAgDRnYh6KRZTbmHKPctcBU90VEP2AXH0
https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858810.html
https://www.sogou.com/link?url=DSOYnZeCC_rR_TP93bdO6EEUqERVuzTa038RSP5KbIr8GvHBq7RXpr2eVscWIoeftsCnpVGpPpA.
1.8、sar
sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等。
命令格式:sar [ option ][ -A ][ -o file ] t [ n ]
t为采样间隔,n为采样次数,默认值1;
-o file表示将命令结果以二进制格式存放在文件中,file是文件名。
option为命令行选项。
option参数如下:
- -A:所有报告的总和
- -u:输出CPU使用情况的统计信息
- -v:输出inode、文件和其他内核表的统计信息
- -d:输出每一个块设备的活动信息
- -r:输出内存和交换空间的统计信息
- -b:显示I/O和传送速率的统计信息
- -a:文件读写情况
- -c:输出进程统计信息,每秒创建的进程数
- -R:输出内存页面的统计信息
- -y:终端设备活动情况
- -w:输出系统交换活动信息
示例1:
https://www.cnblogs.com/howhy/p/6396437.html
https://www.sogou.com/link?url=58p16RfDRLvsgRwZ6iNBPijgIJ6JRTp3S692BdWxCixld2p8xmmJWo7ig65r5gTY
https://www.cnblogs.com/mululu/p/6008313.html
https://blog.csdn.net/wwh578867817/article/details/47297865
1.9、pidstat
pidstat是sysstat工具的一个命令,用于监控全部或指定进程的cpu、内存、线程、设备IO等系统资源的占用情况。pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。
命令格式:pidstat [ option ] [ <时间间隔> ] [ <次数> ]
option参数如下:
- -u:默认的参数,显示各个进程的cpu使用统计
- -r:显示各个进程的内存使用统计
- -d:显示各个进程的IO使用情况
- -p:指定进程号
- -w:显示每个进程的上下文切换情况
- -t:显示选择任务的线程的统计信息外的额外信息
- -T { TASK | CHILD | ALL } 这个选项指定了pidstat监控的。TASK表示报告独立的task,CHILD关键字表示报告进程下所有线程统计信息。ALL表示报告独立的task和task下面的所有线程。注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。
- -V:版本号
- -h:在一行上显示了所有活动,这样其他程序可以容易解析。
- -I:在SMP环境,表示任务的CPU使用率/内核数量
- -l:显示命令名和所有参数
示例1:
示例2:
https://blog.csdn.net/ligupeng7929/article/details/89888768
https://www.jianshu.com/p/3991c0dba094
https://blog.csdn.net/yue530tomtom/article/details/75416591
2、JVM工具
2.1、jps(JVM Process Status Tool):虚拟机进程状况命令
jps的功能和linux中的ps命令类似,可以列出正在运行的虚拟机进程,显示执行的主类名及进程的本地虚拟机唯一ID(Local Virtual Machine Identifier, LVMID)。对本地虚拟机进程来说,LVMID与操作系统的进程ID(PID)是一致的。
jps命令格式:jps [option] [hostid]
选项 | 作用 |
---|---|
-q | 只输出LVMID,省略主类的名称 |
-m | 输出虚拟机进程启动时传递给主类的main()函数的参数 |
-l | 输出主类的全名,如果进程执行的是Jar包,输出Jar路径 |
-v | 输出虚拟机进程启动时JVM参数 |
示例:
C:\Users\zhaozhou>jps -l
12640
13904 org.jetbrains.idea.maven.server.RemoteMavenServer
6592 sun.tools.jps.Jps
14076 org.jetbrains.jps.cmdline.Launcher
2.2、jstat(JVM Statistics Monitoring Tool):虚拟机统计信息监视工具
jstat可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、 JIT 编译等运行数据,在没有 GUI 图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。
命令格式为: jstat [ option vmid [ interval[s|ms] [count] ] ]
对于命令中的 VMID 与 LVMID:如果是本地虚拟机进程, VMID 与 LVMID 是一致的,如果是远程虚拟机进程,那 VMID 的格式应当是:
[ protocol : ][ // ] LVMID [ @hostname[ :port ] / servername ]
参数 interval 和 count 代表查询间隔和次数,如果省略这两个参数,表示只查询一次。
option参数主要分为三类:类装载、垃圾收集、运行期编译状况等,具体参数如下:
假设需要每 1s查询一次进程 14076 垃圾收集状况,一共查询 100 次,那命令应当是:
C:\Users\zhaozhou>jstat -gc 14076 1s 100
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
5120.0 5120.0 0.0 4816.7 33280.0 17096.7 87552.0 104.0 18688.0 18401.2 2304.0 2225.4 3 0.017 0 0.000 0.017
5120.0 5120.0 0.0 4816.7 33280.0 17096.7 87552.0 104.0 18688.0 18401.2 2304.0 2225.4 3 0.017 0 0.000 0.017
具体各个参数使用说明请参考如下:
https://blog.csdn.net/zhaozheng7758/article/details/8623549
https://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html#class_option
2.3、jinfo(Configuration Info for Java):java配置信息工具
jinfo的作用是实时地查看和调整虚拟机各项参数。使用 jps命令的-v参数可以查看虚拟机启动时显式指定的参数列表,但如果想知道未被显式指定的参数的系统默认值,除了去找资料外,就只能使用 jinfo 的 -flag 选项进行查询了(如果只限于 JDK 1.6 或以上版本的话,使用 java -XX : + PrintFlagsFinal 查看参数默认值也可以) , jinfo 还可以使用 -sysprops 选项把虚拟机进程的 system . getProperties ( )的内容打印出来。这个命令在 JDK 1.5 时期已经随着 Linux 版的 JDK 发布,当时只提供了信息查询的功能, JDK 1 . 6 之后, jinfo 在 windows 和 Linux 平台都有提供,并且加入了运行期修改参数的能力,可以使 -fiag [+|-] name 或者 -flag name = value 修改一部分运行期可写的虚拟机参数值, JDK 1.6 中, jinfo 对于 windows 平台功能仍然有较大限制,只提供了最基本的 -flag选项。
jinfo命令格式:jinfo [option] pid
示例:
C:\Users\zhaozhou>jinfo -flag PrintGC 13904
-XX:+PrintGC
2.4、jmap(Memory Map for Java):java内存影像工具
jmap用于生成堆转储快照。如不使用jmap,可在JVM启动参数中添加:-XX:+HeapDumpOnOutOfMemoryError参数,可以在JVM出血OOM时自动生成dump文件。通过:-XX:HeapDumpOnCtrlBreak参数也可以使用Ctrl + Break键让JVM生成dump文件。或是在linux中通Kill -3命令发生进程退出信号给JVM,也能生成dump文件。
同时,jmap还可以查询finalize执行队列、Java堆和永久代的详细信息,如空间使用率、堆栈配置、垃圾收集器信息等。
jmap命令格式:jmap [option] vimd
option选项:
示例:
2.5、jstack(Stack Trace for Java):java堆栈跟踪工具
jstack用于生成虚拟机当前的线程快照(threaddump或javacore)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。线程出现停顿的时候通过 jstack 来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事,或者等待着什么资源。
jstack命令格式:jstack [option] vmid
option选项:
在 JDK 1 . 5 中, java . lang . Thread 类新增了一个 getAllstackTraces( )方法用于获取虚拟机中所有线程的 stackTraceElement 对象。使用这个方法可以通过简单的几行代码就完成 jstack 的大部分功能,在实际项目中不妨调用这个方法做个管理员页面,可以随时使用浏览器来查看线程堆栈。
2.6、Jconsole(Java Monitoring and Management Console):java监视与管理控制台
基于JMX的可视化监视、管理工具。其管理部分的功能是针对JMX MBean进行管理,由于MBean可以使用代码、中间件服务器的管理控制台或者所有符合JMX规范的软件进行访问。
主要功能为内存、线程、类、JVM参数、MBean等相关信息的监控。
2.7、VisualVM(All-in-One Java Troubleshooting Tool):多合一故障处理工具
VisualVM是到目前为止随JDK发布的功能最强大的运行监视和故障处理工具。其性能分析功能比JProfiler、YourKit等专业收费的Profiling工具都不会逊色多少。同时VisualVM不需要被监视的程序基于特殊Agent运行,故其对应用程序的实际性能影响很小,使其可以直接应用于生产环境中。
VisualVM支持插件扩展:在“工具”—>“插件”—>“可用插件”中有很多好用的插件,可下载安装。
2.8、MAT(Memory Analyzer Tool):图形化分析工具
MAT是一款功能强大的java对内存分析器,可用于查找内存泄漏以及查看内存消耗情况。
2.9、JProfile
JProfile是一款优秀的商业软件,它的功能非常全面,同时也具备一些免费软件所无法达到的功能。JProfile的主要功能有内存分析、快照分析、CPU分析、线程分析和JVM性能信息收集等。