因为想拥有,所以要不断努力

性能测试常见问题分析之JVM内存溢出篇(摘自51testing)

上一篇 / 下一篇  2013-09-22 17:21:17 / 个人分类:JVM

 
 
 
   前段时间做了一个Java的B/S架构项目的性能测试,app和DB都为HP G6刀片,CPU为16core,内存16G,操作系统为linux redhat5.4 32位,中间件采用weblogic10.3,数据库为Oracle11G,JVM设置为初始1G,最大1.5G,配置总体来说还不错吧!

   在负载测试中,某支交易在30并发时,JVM内存瞬间升到1.5G,再过一段时间,loadrunner前端显示TPS已经降到0,持续了一段时间之后也没有回升,怀疑系统可能已经宕机了。通过访问地址,服务器没有响应,于是查看WEBLOGIC的系统日志,发现后台报了一大堆OOM的异常信息,分析了一下日志,没有找到明显的线索,觉得还是先找开发人员检查了一下代码,开发人员查找了一下对应功能代码,也没有发现明显的问题。

   进入weblogic目录,发现系统已经生成了一些javacore和heapdump文件,拿到文件之后使用jcahca工具分别分析了以上两个文件,在javacore文件分析结果中红色字体显示free为0,线程基本正常,在heapdump分析结果中可以看到java/util/List对象大概占了1.3G的内存,占总百分比的87%,初步怀疑是由于引用了该集合类数据类型的对象引发的内存溢出,于是按图索骥,找到该功能调用的某一个service的方法,具体如下:

public CcTransLogVOquerySingleLogInfo(StringcstNo, Stringbsn)throwsServiceException{

  CcTransLogVOlogInfo= new CcTransLogVO();try {

 IHibernateDaoSysServicedao=

 (IHibernateDaoSysService)AppContextUtil.getBean("hibernateDaoSysService"); 

Stringhql= "from CcTransLogVOt wheret.userId= ? andt.bizCodelike ? order byt.dateTimedesc";

ListresultList=dao.findByHql(hql, new Object[]{cstNo,"%"+bsn+"%"});

 if(resultList!=null&&resultList.size()>0){

 logInfo= (CcTransLogVO)resultList.get(0);

 }else{

 logInfo= null;

 }

 returnlogInfo;

该段代码主要查询该客户最近一笔交易日志信息,日志表的数据量一般能达到百万级以上,上面程序费了很大劲从数据库了取出了大量的数据放到list中,然后却只用了第一条记录。

如果在一定量的用户并发请求时的情况下,导致JVM内存瞬间溢出,从而引发宕机,经过修改程序,把运算放到数据库层去执行,并且建立相关索引,再次验证,问题解决。



TAG:

引用 删除 mofan-5   /   2015-09-07 15:25:44
5
 

评分:0

我来说两句

Open Toolbar