J2EE系统测试典型问题以及解决办法

0.压力测试:

  3.1 应用程序级cpu,内存,线程等 jprofile,jconsole,jdk,stacktrace
 
  3.2 系统性能:vmstat,iostat,prstat,snoop,jsniffer,gclog,threaddump
  其中prstat -L 进程号 可以查看该进程对应的所有线程. 
 
  用kill -3 进程号 可以在console输出该进程所对应的所有线程的堆栈输出 。其中nid为线程号
  ctrl+break 可以查看console方式下的堆栈信息
  3.3 数据库:数据库专用工具 
  3.4 omt(swing):可以通过两种方式来查看事件线程的情况:
         利用灰屏时打印stackTrace来看,ctrl+break
         利用EventDispatchThreadHangMonitor.initMonitoring()自动会输出EDT中耗时的操作
  
 
  对于常见的情况:死锁,耗时(cpu),crash,内存大(溢出),
  生产环境,可以用jdk自带的工具,statckTrace,jconsole;prstat 
  jprofile用于开发.测试环境  
 
 使用stackTrace查看问题的时候,如果是想查看cpu到底耗时在哪个thread上,考虑多几次stacktrace,如果某个线程一直在某个方法上,就要考虑这个方法了
 

1.使用jprofile来检查系统的耗时,耗内存,线程等方面问题,精确到类和方法

2.使用oracle自带工具检测数据库以及sql优化内容,以及优化建议

查看表结构,发现MOC表没有对CID建索引,这是性能差的主要原因。
 
建议建(dn,cid)复合索引,而且
SELECT DN FROM OMCR.MOC where cid='33686761' and dn like 'RAN=385, RNC_INFO=385%'
语句的条件写成 dn like 'RAN=385, RNC_INFO=385%' and cid='33686761'比较合适
 
2
Execute to Parse %: 15.92 这个指标比较低
因为parse次数太多导致
 
SELECT DN FROM OMCR.MOC where cid='33686761' and dn like 'RAN=385, RNC_INFO=385%'
这几个语句执行次数都比较多,请看一下这些语句是否没有用动态绑定以及preparestatement
 
3
delete from moc where dn like :b0
select * from moc where (dn=:1 or dn like :2) and cid in (select cid from sysattrtable where attrid>=100 and attrid<200)
这2句耗时也比较长,是配置服务器操作的, 问一下OMC是不是在做配置同步操作

3.使用sniffer监测网络包情况

4.jboss中jmsmessage有关持久化带来的耗时问题

5.有关hibernate中批量插入和更新的效率问题.

http://www.jdon.com/article/25431.html 这个帖子详细说明了一级,二级缓存的原理

6. lsof用来查看端口占用情况(占用被什么进程占用)
root@hromcr # lsof -i|grep 7090
java       5589   v3test   11u  IPv4 0x600043356c0        0t0  TCP *:7090 (LISTEN)
root@hromcr # ps -ef|grep 5589
    root  7377  7282   0 16:37:00 pts/5       0:00 grep 5589
  v3test  5589  5579   0   Oct 09 pts/2     152:36 /usr/jdk/jdk1.5.0_07/bin/java -server -Dprogram.name=run.sh -Djava.endorsed.dir

7.由于OMCR的相关进程在PC机的任务管理器上都显示为“JAVA”,因此回出现多个JAVA进程在任务管理器上,无法根据名称区分模块。因此目前到底是OMCR的哪一个模块CPU占用率接近100%.

解答:
 

Windows平台提供的进程信息不足,不能够获得启动程序时传入的参数,也就是诸如 “java - jar -XXXXX a.jar”,java后的信息不能获取,也就很难区分多个Java进程。
由于进程ID的大小是顺序分配的,请根据任务管理器中的PID进行区别,先启动的Java进程的PID相对较小,后启动的PID大

还可以使用 window进程管理器,选择相应的Java进程后,关注它的模块信息通常1个JVM进程依赖的Windows操作系统模块数是固定的,可以分别对OMCR通讯模块NEA、性能通讯模块PC、OMT进行观察,确定它所包含的模块数特征,最终也能够确定哪个Java进程是哪个程序。

1.定时调度MBean,调用check方法,首先一次获取每个jndi名,然后lookup,再利用查询到的home接口 反射create方法获取远程接口,调用check方法是否成功,
若成功,说明bean正常,继续判断bean状态是否为从不可用到可用,若是,继续判断是否需要初始化,设置bean状态为可用。目的就是为了让客户端知道linkup.linkDown.需要进行业务处理,至少对告警来说,需要重新获取告警.示例代码:
 
 //从配置文件中读取需要监控的列表
  if(SvrBeanList.instance().getSvrBeanList().size()==0)
  {
   ArrayList<SvrBeanInfo> mBeanList;
   try {
    mBeanList = ServerBeanInit.getServerBean();
    SvrBeanList.instance().setSvrBeanList(mBeanList);
   } catch (ServerBeanMonitorException e) {
    Logger.getLogger(this.getClass()).error(e.getMessage());
   }
  }    
    
  //依次遍历列表对进行监控
  SvrBeanInfo mSvrBeanInfo=null;
  //遍历列表
  for(Iterator it = SvrBeanList.instance().getSvrBeanList().iterator(); it.hasNext();)
  {
   try
   {
    mSvrBeanInfo = (SvrBeanInfo)it.next();
            
    //获取Bean home
    Object svrHome = MBeanFactory.getInitialContext(mSvrBeanInfo.getBeanName()).lookup(mSvrBeanInfo.getBeanName());  
        
    //利用反射机制获取create方法,并执行
       Method method = svrHome.getClass().getMethod("create",null);
      
       IMonitor monitor = (IMonitor)method.invoke(svrHome, null);
      
       //调用check方法检验bean是否正常
       monitor.check();
    
      
       //如果Bean状态由不可用变为可用,判断是否初始化
       if(mSvrBeanInfo.getState()==ServerBeanConst.SERVER_BEAN_DISCONNECT)
       {
        //若没有初始化,则调用init方法进行初始化
        if(!monitor.isInit()){
         monitor.init();
         Logger.getLogger(this.getClass()).info(mSvrBeanInfo.getModuleName() + " module init successful.");
        }
       }
      
      
       //设置为连接状态
       mSvrBeanInfo.setState(ServerBeanConst.SERVER_BEAN_CONNECT);             
       //Logger.getLogger(this.getClass()).debug("check successful.");
      
   }catch(Exception ex){
 
    //设置为断连状态
    mSvrBeanInfo.setState(ServerBeanConst.SERVER_BEAN_DISCONNECT);
    Logger.getLogger(this.getClass()).error(ex.getMessage());
    break;    
   }
  } 
  
在Client本地,启动一个Timer,隔断时间去查询获取bean的状态信息,从而回调业务代码

 

 

pstack.plockstat.lockstat.mpstat

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值