构建自己的监测器【1】-监测工具(转)

 

监测器(profiler):

监测器的目的是什么?监测器主要是为了检测程序主要哪些地方耗费资源,可能包括cpu资源,内存资源等。利用监测器可以分析出方法的耗时,程序所占内存资源。根据监测器分析出的信息,可以进行有针对性的优化。

现有的监测方式

1.   最简单的方式 System.out.println()  这种方式应该开放最常用最简单的跟踪程序运行情况的方式了。
 有一个方法:
[java]  view plain copy
 
  1. public void sayHello(){  
  2.     Thread.sleep(1000);  
  3.      print("hello world");  
  4.  }  
如果要知道这个方法的耗时,该怎么做呢?最常用的方式就是在方法体前后加入时间戳,如下:
[java]  view plain copy
 
  1. public void sayHello(){  
  2.   long startTime =  System.currentTimeMillis();    
  3.    Thread.sleep(1000);  
  4.     print("hello world");  
  5.   long endTime =  System.currentTimeMillis();    
  6.   
  7.  System.out.println("方法耗时为:"+(endTime-startTime)+"ms");  
  8. }  
这应该是最原始的方法了。
这个方法的好处就是简单,易于使用,只要在方法前后插入代码就可以了,但是它有很大的不足:
首先、它完全手工,和业务代码耦合性可能会非常高。要监测那个代码,那就在哪个方法中插入上面类似的代码,然后重新编译,打包,部署。监测完之后呢?删除上面的代码,重新打包部署。。(也许做的智能点,可以将上面的代码段是否执行加个开关,但是总体还是很挫的,你说呢?)
其次、这种手工的方式监测可监测的方面太窄了,写一次可能只能监测方法的耗时,下次想监测方法执行次数,那就要重新写一份。
 
2、 jdk自带的hprof: 上面这种方式的缺陷很明显,还好,JDK本身也提供了一些用来分析的工具,比如
J2SE中提供了一个简单的命令行工具来对java程序的cpu和heap进行 profiling,叫做HPROF。HPROF实际上是JVM中的一个native的库,它会在JVM启动的时候通过命令行参数来动态加载,并成为 JVM进程的一部分。若要在java进程启动的时候使用HPROF,用户可以通过各种命令行参数类型来使用HPROF对java进程的heap或者 (和)cpu进行profiling的功能。HPROF产生的profiling数据可以是二进制的,也可以是文本格式的。这些日志可以用来跟踪和分析 java进程的性能问题和瓶颈,解决内存使用上不优的地方或者程序实现上的不优之处。二进制格式的日志还可以被JVM中的HAT工具来进行浏览和分析,用 以观察java进程的heap中各种类型和数据的情况。有一个关于hprof的学习文章,有兴趣的可以看看http://longmans1985.blog.163.com/blog/static/706054752011715112723303/ 
 
但是hprof也有自己的限制:
hprof分析的是整个JVM容器内的情况,有很多信息是我们不想要的。比如运行jboss时,hprof会把jboss的信息也会分析到。而我们需要的信息只是自己应用代码的,而不需要jboss的,甚至其他三方类库的。
而且利用hprof分析程序是比较慢的,据说利用hprof运行程序会是程序慢20倍,这个我没测试过。但是利用hprof长时间来分析应用程序很明显是不太恰当的。
 
除了System.currentTimeMillis() 和hprof之外,还有一些其他的分析工具。
除了现有的方式, 我们也可以构建自己的监测器:主要是利用java instrumentation和java代理来实现。javaagent和instrumentation这个东西已经不是新鲜的玩意了,在JDK5的时候引入的,JDK6上又有了一些新的特性。不少监测工具都是构建在instrumentation的基础上的,比如btrace,JIP等。关于java instrumentation的资料,网上搜搜,好像有一大堆的,不过有用的资料也就那几篇。
下一篇就学习下javaagent如何使用吧。

原文http://blog.csdn.net/qyongkang/article/details/7765255

猜你喜欢

转载自summer85.iteye.com/blog/2206421