距离上次介绍Jconsole已经时隔两周了,这期间由于工作中要用go来做一个新项目,所以精力都用在入门go上了,不过发现go语言用起来真的挺不错的,比python感觉还好点,大家没事可以了解下。
    言归正传,VisualVM和Jconsole同是图形化的jvm监控和分析工具,两者在一些基本功能上的使用大同小异,比如内存、线程、jvm环境参数等,但是相对而言VisualVM的功能要稍强于Jconsole,相当于加强版的Jconsole。同是visualVM的一些高级功能是通过安装插件来拓展,所以更能因需定制。先看下起始页:

由于VisualVM官方已经提供了很完善的使用文档(同样是亲儿子,Jconsole的文档就有点寒掺了,而且VisualVM有一部分竟然有中文版),所以这里就不做详细介绍,只重点看一下的VisualVM两个方面:

  • 插件安装
  • 程序性能分析

一、VisualVM插件安装

这个其实没什么好介绍的,基本上看图就明白了。插件可以进行手工安装,可以再插件中心下载*.nbm,在选项“工具—插件—已下载”中选择安装,但是作为一款便捷的图形化工具,这样做无意有点费事,其实在"工具—插件"中我们可以直接管理已安装插件,并选择下载安装需要的新插件。看图:

可以看到VisualVM提供了很丰富的插件,我们只要选中需要插件,点击安装即可(当然,前提是你待联网了)。好了,就是这么简单。

二、程序性能分析

这里使用我写的一个小的web服务器做示例,介绍和代码见博客(由于之后更新,可能github与介绍有一定出入),可运行包见下载(目前win下可直接通过bin下start.bat启动,由于start.sh是拷之前一个项目的,暂时有些问题,所以linux下就直接java命令启动吧),成功启动后如下:

然后通过VisualVM打开对应进程,可以通过概述、监视、线程、visaul GC查看程序当前jvm参数、内存、cpu、线程和gc的各项情况。我们这里重点关注一下VisualVM提供的性能分析工具Profilter,我们直接打开该选项卡,点击CPU将开始收集信息并分析。结果你可能发现当时只有ServerTimerTask.run()一项(也可能会有很多项,这主要由于是实时分析,看你打开时程序在做什么操作,是个web服务器,所以可能有个定时轮询的任务一直在执行,所以至少会有这一项,而且包路径sun.net.httpserver也可能看出这点),为了尽快看到更多调用信息,我们直接在浏览器打开http://localhost:8888/json/show.do (这是测试项目中测试json数据的路径),会发现出现很多调用信息,截图如下:

可以看到cpu耗时最多的是log,这其实也好理解,由于写代码的时候几乎在每个操作内都打了log,而且还有写外部log文件的操作,所以耗时较长,从这点看这个程序应该选择一些关键地方打log,比如在调度模块的起止地方、异常处理模块里边,而没有必要每个操作都输出信息。而第二个则是Exchange.run(),这个更好理解了,由于程序在http请求接收和相应处理上目前使用jdk的httpserver模块,而Exchange正是对这些操作的封装,是web服务器的核心模块,cpu耗时多是自然的。第三名如果你看过代码就明白了,responseToClient方法是将响应数据写入响应流。其他的就不一一分析了,其实了解了功能和代码就很容易看明白。
    我们再来看下调用次数,按照调用次数排序后,会发现ServerTimerTask.run()调用次数远远高于其他方法,这个根据前边说的应该都明白,就不解释了。同时可以看一下responseToClient()的调用次数,会发现和你网页上请求的次数一致。
    最后我们来看一个典型的例子,我们在方法名过滤器输入SessionCleanTask,结果如下:

    如果你耐着心观察,会发现没两分钟调用次数会+1,其实这个方法是个timeTask,作用就是每两分钟清理一次过期的session(咱这程序麻雀虽小,但还算五脏俱全吧^_^)。

下边看下内存的分析,该项里边可以看到每个对象实时的内存占用、对象数和年代数,具体分析思路其实和cpu大同小异, 就不再细说了,看图:

好了,VisualVM介绍到此结束,其实其功能要比这强的多,比如dump文件分析和BTrace动态日志追踪(通过热插入日志代码分析程序)等,感兴趣就自行分析吧,这里还有一篇介绍VisualVM可供参考
    之后将考虑开始写类文件结构和类加载部分,不过由于工作忙起来了,所以速度可能慢些,尽量一周至少一篇吧。不费话了,没衣服穿了,出去买件衣服,不然明天木法上班了T_T。

JVM学习总结五(番外)——VisualVM的更多相关文章

  1. JVM学习总结五(番外)——JConsole

    之前本来打算结合自己写的小程序来介绍JConsole和VirtualVM的使用的,但是发现很难通过一个程序把所有的场景都体现出来,所以还是决定用书中的典型小例子来讲更加清晰. 一.JConsole的基 ...

  2. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  3. Netty学习笔记(番外篇) - ChannelHandler、ChannelPipeline和ChannelHandlerContext的联系

    这一篇是 ChannelHandler 和 ChannelPipeline 的番外篇,主要从源码的角度来学习 ChannelHandler.ChannelHandler 和 ChannelPipeli ...

  4. JVM学习总结五——性能监控及故障处理工具

    之前扯了四篇理论,这一篇终于可以动动手了.本篇我们将介绍JVM常用的一些工具,这些工具将是我们监控JVM状态.处理故障和调优分析的利器. 不过在开始之前,我还是要先车扯两句:工具终归只是帮助我们我们处 ...

  5. JVM学习(五)对象的引用类型

    一.引言 前面我们学习了JVM的垃圾回收机制,我们知道了垃圾回收是JVM的自发行为:虽然我们可以通过System.gc() 或Runtime.getRuntime().gc()进行显式调用垃圾回收 , ...

  6. java jvm学习笔记五(实践自己写的类装载器)

     欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和 ...

  7. JVM学习笔记五:虚拟机类加载机制

    类加载生命周期 类加载生命周期:加载.验证.准备.解析.初始化.使用.卸载 类加载或初始化过程什么时候开始? 遇到new.getstatic.putstatic或invokestatic这4条字节码指 ...

  8. JVM学习(五) -执行子系统

    虚拟机和物理机的区别.两种都有代码执行能力.物理机的执行引擎是建立在处理器.硬件.指令集和操作系统上.而虚拟机的执行引擎是有自己实现的.因此可以自行的制定指令集和执行引擎的结构关系. 个人理解:分为三 ...

  9. JVM学习十五 - (复习)类加载的时机、类加载过程、类加载器

    一.类加载的时机 类的生命周期 类从被加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期包括以下 7 个阶段: 加载 验证 准备 解析 初始化 使用 卸载 验证.准备.解析 3 个阶段统称为连接 ...

随机推荐

  1. js实现自动登陆的按钮

    自动按钮,只要实现当移入是提示用户不要在公共地方使用自动登陆 主要用onmouseover函数,本来提示div隐藏,当移入时div显示. <style type="text/css&q ...

  2. 洛谷P1631 序列合并

    P1631 序列合并 236通过 657提交 题目提供者xmyzwls 标签堆 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 为什么不行? 题目描述 有两个长度都是N的序列A和B,在A和B中 ...

  3. ENVI如何打开IRS P6的AWIFS的ges及LISS3的ges文件?

    AWIFS文件下文件名如下:ID2010236001.hdrID2010236001_2.gesID2010236001_3.gesID2010236001_4.gesID2010236001_5.g ...

  4. div模仿select效果二:带搜索框

    项目需要,要做一个首字母快速定位的select,代码如下: HTML <div class="select_country" unselectable="on&qu ...

  5. 【好文要转】Python:模拟登录以获取新浪微博OAuth的code参数值

    [转自]http://www.tuicool.com/articles/zAz6zi [原文]http://blog.segmentfault.com/hongfei/1190000000343851 ...

  6. poj2031 Building a Space Station

    这题目,用G++ WA,用C++ AC. 题目要求,现给出n个球,然后要使每两个球直接或者间接连通,可以在任意两球之间做管道(在表面),最后的要求是,如果使得都连通的话,管道最小长度是多少. 思路简单 ...

  7. Solaris进程管理

    ps-a    列出与终端有关的进程-e    列出所有进程-A    同-e-f      列出进程完整信息-l      生成一个长列表-u username 列出某用户的进程 常用:ps -ef ...

  8. 搭建高性能计算环境(六)、应用软件的安装之lammps

    1,上传需要的软件包lammps-stable.tar.gz. 2,解压缩并进入安装目录 tar xvf lammps-stable.tar.gz cd lammps-30Oct14 3,如果需要re ...

  9. 自己实现的一款在线Javascript正则表达式测试器——JRE-Parser

    本文最初发布于我的个人博客:http://jerryzou.com/posts/jreparser/ 昨天在看<正则表达式30分钟入门教程>的时候,看到博主自己实现了一个C#写的正则测试器 ...

  10. Win7下安装IEWebControls.msi

    编写人:CC阿爸 2014-2-22 IEWebControls.msi是发布在.net 1.1时代.微软为弥布.net控件的不足而发布一组控件.很多程序猿都喜欢用到他. 方法一: 首先保证IIS7安 ...