因为想拥有,所以要不断努力
性能测试常见问题分析之JVM内存溢出篇(摘自51testing)
上一篇 /
下一篇 2013-09-22 17:21:17
/ 个人分类:JVM
在负载测试中,某支交易在30并发时,JVM内存瞬间升到1.5G,再过一段时间,loadrunner前端显示TPS已经降到0,持续了一段时间之后也没有回升,怀疑系统可能已经宕机了。通过访问地址,服务器没有响应,于是查看WEBLOGIC的系统日志,发现后台报了一大堆OOM的异常信息,分析了一下日志,没有找到明显的线索,觉得还是先找开发人员检查了一下代码,开发人员查找了一下对应功能代码,也没有发现明显的问题。
进入weblogic目录,发现系统已经生成了一些javacore和heapdump文件,拿到文件之后使用jca、hca工具分别分析了以上两个文件,在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: