多线程分析工具Mtrat使用

 

 

http://xiao-jiang51.javaeye.com/blog/841332

 

一个非常不错的多线程分析工具,提供方是IBM,官方上的说明貌似是中国人开发的,NB,反编译看了下 用到了AOP的东东,对死锁的诊断非常有价值,官方地址http://www.alphaworks.ibm.com/tech/mtrat
   因在一个为两W人在线服务的保险销售系统中使用到了一个并非控制器,因生产环境是1.4的版本,无法使用最新的无锁定算法支持,Doug Lea 大牛的那个并发包也就是被JDK 1.5吸收的那个NB包的原子类其实还是全部锁定的(1.5及之后全部被重写为无锁定算法),本人觉得会降低该控制器的并发量,决定自己用 volatile 和
synchronized 实现并发控制逻辑,要求很简单,业务请求不能超过并发量,超过并发量不处理。
   因这个功能结合的是业务的一个ajax定时刷新请求,PM 要求务必保证计数的正确与不产生死锁问题,这可不是闹着玩的,生产系统要是因为这个导致宕机,后果相当严重。为了保证质量,借助工具是非常必要的。
   在这个过程中引入了mtrat 来分析代码。网上貌似没发现有比较详细的中文使用说明,那个手册毕竟是英文版的,俺们就把自己使用的过程罗列下吧,防止忘记,这确实是个好东西。。
   首先到IBM官网下载mtrat 的最新包,需要有ibm id,没有需要注册
    其中的com.ibm.threadanalysis.dynamic.feature.zip 是eclipse 插件
   将其解压含 features 和plugins 两个文件夹,要是偷懒,直接将文件夹得内容复制到eclipse相应目录,重启eclipse 即可,不过最好还是用link 的方式比较好
   创建一个名为com.ibm.mtrat.link文件里面的内容是path=F://Mtrat//doc//plugin 这个目录下含一个eclipse 文件名 里面含上面的 features 和plugins 两个文件夹及相应内容,让后将link文件仍到ecipse 的links文件夹即可,没有就新建,如果不想要了将link 后缀名改掉或着删除这个文件即可,非常方便。

   安装好后,eclipse工具栏上会出现

   安装好后在windows(窗口)菜单的preferences(首选项)中会见到一个Thread Analysis 的项   ,如果点击出错提示什么bad version class 之类 说明eclipse jre版本低了 换到1.6才行,直接用1.6的jre 替换eclipse下的jre即可。


  将开关打开,并且设置mtrat目录,这个很重要,必须正确才能使用,这个目录的文件含从IBM 那下载来的mtrat-instrument-analysis-20090218.zip 解压文件
  本人解压后文件如图


图中有3个选择的对象不是解压后产生的,那个asm-all-3.0.jar 是下载的(http://download.forge.objectweb.org/asm/下面有)
那java 目录和target.jar是生成的,mtrat的说明文档很啰嗦,又是点击mtrat.bat 啊又是设置环境变量的 太麻烦,俺们直接反编译InstrumentClass了解机制,然后直接整了个类InstrumentClassImpl

Java代码
  1. package  com.gm;  
  2.   
  3. import  java.io.File;  
  4.   
  5. import  com.ibm.threadanalysis.dynamic.tool.InstrumentClass;  
  6. /**  
  7.  * FOR SUN JDK   
  8.  * @author [url=mailto:xiao_jiang51@163.com]xiao_jiang51[/url]  
  9.  * @version 1.0  Create on Dec 14, 2010 12:07:52 AM  
  10.  */   
  11. public   class  InstrumentClassImpl  extends  InstrumentClass{  
  12.   
  13.     @Override   
  14.     protected  String[] makeClassList() {  
  15.         return   new  String[] {  "java/lang/ref/WeakReference.class""java/lang/Thread.class""java/lang/Class.class"  };  
  16.     }  
  17.       
  18.     public   static   void  main(String[] args) {  
  19.         InstrumentClass ic=new  InstrumentClassImpl();  
  20.         String path="F:" +File.separator+ "Mtrat" ;  
  21.         ic.createJar(path);  
  22.     }  
  23.   
  24. }  
package com.gm;

import java.io.File;

import com.ibm.threadanalysis.dynamic.tool.InstrumentClass;
/**
 * FOR SUN JDK 
 * @author [url=mailto:xiao_jiang51@163.com]xiao_jiang51[/url]
 * @version 1.0  Create on Dec 14, 2010 12:07:52 AM
 */
public class InstrumentClassImpl extends InstrumentClass{

	@Override
	protected String[] makeClassList() {
		return new String[] { "java/lang/ref/WeakReference.class", "java/lang/Thread.class", "java/lang/Class.class" };
	}
	
	public static void main(String[] args) {
		InstrumentClass ic=new InstrumentClassImpl();
		String path="F:"+File.separator+"Mtrat";
		ic.createJar(path);
	}

}


将asm-all-3.0.jar  和class.jar 拷贝到工程classpath下  运行,需要1.6以上的编译运行环境,就会多出java 和target.jar两个东东,如果首次运行的是1.6以下的,需要将java文件夹和target.jar先删除再次运行获得新的文件夹和jar



上面的过程其实就是mtrat 为了修改了部分jdk类的字节码,加入了自己的逻辑,AOP很强大
一切准备妥当,就得小白鼠上台
mtrat 准备了以个sample 位于com.ibm.threadanalysis.dynamic.feature.zip 中
在解压后的plugin文件夹中的com.ibm.threadanalysis.dynamic.examples_1.0.0.jar中 解压出来有个Sample.zip 解压后有个Samples工程,直接导入到eclipse 即可,其实呢mtrat的说明文档中不是这样用它的 说的是如果插件安装成功可以通过在eclipse 中的new 菜单中的example菜单中整出来的 反正我是没整出来,就自己去找了。
  导入后就2个类


将analysis视图打开


先在eclipse 中将2个类run一下 编译运行环境是1.6以上,再点击 analysis按钮,就能获得分析结果了
例子是多线程中的两种类型的问题
下面的是数据不一致的读写问题


下面的是死锁问题

  • 大小: 19 KB
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值