您的位置:首页 > 编程语言 > Java开发

java自带的其它分析工具

2012-07-26 17:28 274 查看
从java1.6开始就提供了很多内存监控的小工具,除上面介绍的工具外,下面再列举的其它的有用工具

  1:gc日志输出

  在jvm启动参数中加入 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimestamps -XX:+PrintGCApplicationStopedTime,jvm将会按照这些参数顺序输出gc概要信息,详细信息,gc时间信息,gc造成的应用暂停时间。如果在刚才的参数后面加入参数 -Xloggc:文件路径,gc信息将会输出到指定的文件中。其他参数还有

  -verbose:gc和-XX:+PrintTenuringDistribution等。

  2:jconsole

  jconsole是jdk自带的一个内存分析工具,它提供了图形界面。可以查看到被监控的jvm的内存信息,线程信息,类加载信息,MBean信息。

  jconsole位于jdk目录下的bin目录,在windows下是jconsole.exe,在unix和linux下是jconsole.sh,jconsole可以监控本地应用,也可以监控远程应用。 要监控本地应用,执行jconsole pid,pid就是运行的java进程id,如果不带上pid参数,则执行jconsole命令后,会看到一个对话框弹出,上面列出了本地的java进程,可以选择一个进行监控。如果要远程监控,则要在远程服务器的jvm参数里加入一些东西,因为jconsole的远程监控基于jmx的,关于jconsole详细用法,请查阅jconsle的相关文章。

  3:jviusalvm

  在JDK6 update 7之后,jdk推出了另外一个工具:jvisualvm,java可视化虚拟机,它不但提供了jconsole类似的功能,还提供了jvm内存和cpu实时诊断,还有手动dump出jvm内存情况,手动执行gc。

  和jconsole一样,运行jviusalvm,在jdk的bin目录下执行jviusalvm,windows下是jviusalvm.exe,linux和unix下是jviusalvm.sh。

  

4:eclipse内存分析器

  上面说了jhat,它能分析jvm的dump文件,但是全部是文字显示,eclipse memory analyzer,是一个eclipse提供用于分析jvm 堆dump的插件,网址为 http://www.eclipse.org/mat ,它的分析速度比jhat快,分析结果是图形界面显示,比jhat的可读性更高。其实jvisualvm也可以分析dump文件,也是有图形界面显示的。

  5:jstat

  如果说jmap倾向于分析jvm内存中对象信息的话,那么jsta就是倾向于分析jvm内存的gc情况。都是jvm内存分析工具,但显然,它们是从不同维度来分析的。jsat常用的参数有很多,如 -gc,-gcutil,-gccause,这些选项具体作用可查看jsat帮助信息,我经常用-gcutil,这个参数的作用不断的显示当前指定的jvm内存的垃圾收集的信息。

  我在本机执行 jstat -gcutil 1229 5000,这个命令是每个5秒钟输出一次jvm的gc信息,5000指的是间隔时间为5000毫秒。显示如下信息:

  S0 S1 E O P YGC YGCT FGC FGCT GCT

  54.62 0.00 42.87 43.52 86.24 1792 5.093 33 7.670 12.763

  jdk将对象按照生命周期分成三个层次,分别是:新生代,旧生代,持久代。对象刚开始分配的时候,大部分都在新生代,当新生代gc提交被触发后了,执行一次新生代范围内的gc,这叫minor gc,如果执行了几次minor gc后,还有对象存活,将这些对象转入旧生代,因为这些对象已经经过了组织的重重考验了哇。旧生代的gc频率会更低一些,如果旧生代执行了gc,那就是full gc,因为不是局部gc,而是全内存范围的gc,这会造成应用停顿,因为全内存收集,必须封锁内存,不许有新的对象分配到内存,持久代就是一些jvm期间,基本不会消失的对象,例如class的定义,jvm方法区信息,例如静态块。需要主要的是,新生代里又分了三个空间:eden,susvivor0,susvivor1,按字面上来理解,就是伊甸园区,幸存1区,幸存2区。新对象分配在eden区中,eden区满时,采用标记-复制算法,即检查出eden区存活
的对象,并将这些对象复制到是s0或s1中,然后清空eden区。jvm的gc说开来,不只是这么简单,例如还有串行收集,并行收集,并发收集,还有着名的火车算法,不过那说得太远了,现在对这个有大致了解就好。说到这里,再来看一下上面输出的信息:

  S0 S1 E O P YGC YGCT FGC FGCT GCT

  54.62 0.00 42.87 43.52 86.24 1792 5.093 33 7.670 12.763

  S0:新生代的susvivor0区,空间使用率为5462%

  S1:新生代的susvivor1区,空间使用率为0.00%(因为还没有执行第二次minor收集)

  E:eden区,空间使用率42.87%

  O:旧生代,空间使用率43.52%

  P:持久带,空间使用率86.24%

  YGC:minor gc执行次数1792次

  YGCT:minor gc耗费的时间5.093毫秒

  FGC:full gc执行次数33

  FGCT:full gc耗费的时间7.670毫秒

  GCT:gc耗费的总时间12.763毫秒

6.jmap和jstat在上一篇中已作了介绍,请查看!

推荐: 分析服务器的内存分配和gc信息时,我们先用jmap导出服务器端的jvm的堆dump文件,然后用jhat,或者jvisualvm,或者eclipse内存分析器来分析内存状况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: