版本号: 7.0.0.25
操作系统:
Linux
Redhat 6.2
内存:16G
CPU :2x4
中间件 websphere 7
jrule版本:jrule 7.1.1
问题描述:
项目是保险公司的项目, 目前的一个规则项目中,有最多大概6W 条规则左右,规则调用的过程中,是根据报文中版本号来读取对应版本的规则库,规则在部署到生产环境环境之后,系统个反应比较慢,大概有的规则会执行超过十秒的时间, 资源适配器 XU 目前配置的线程数 最小100 最大也是100 ,WAS 中的jvm 堆最小配置的是2G 最大堆配置的5G ,然后再重新之后 有台服务器 大概执行十分钟之后,服务当掉,通过netstat -anp |grep 9080 查看 连接状态 ,会有大量的请求处于 time_wait 中 , 系统服务 出现卡死状态,
经过IBM 现场工程师的 分析如下:
分析结果:
该dump文件出现ilog可疑代码导致的内存泄露情况
1,400,716,448 bytes (22.26 %) of Java heap is used by 24,924 instances of ilog/rules/parser/IlrPackageDefinition
3. 对javacore进行研究分析。
com/firsttech/v7/insure/service/impl/RuleEngineServiceImpl.callEngineOnPojoRuleSession(Bytecode PC:68)
at com/firsttech/v7/insure/service/impl/RuleEngineServiceImpl.salesFee(Bytecode PC:255)
at com/firsttech/v7/insure/service/impl/ExecutionServiceImpl.salesFee(Bytecode PC:27)
at com/firsttech/v7/insure/webservice/impl/InsureServiceImpl.salesFee(Bytecode PC:118)
分析结果:
查找可疑的相关的代码 com.firsttech.v7.insure.service.impl.RuleEngineServiceImpl.salesFee,该代码导致系统线程挂起。
其中:salesFee 代码如下:
try {
IlrSessionFactory pojoFactory = new IlrPOJOSessionFactory();
ilog.rules.res.session.IlrSessionRequest sessionRequest = pojoFactory
.createRequest();
sessionRequest.setRulesetPath(IlrPath.parsePath(rulesetPath));
Map
.getInputParameters();
inputParameters.put("input", policy);
IlrStatelessSession statelessSession = pojoFactory
.createStatelessSession();
IlrSessionResponse response = statelessSession
.execute(sessionRequest);
Map
.getOutputParameters();
ResultXom result = (ResultXom) outputParameters.get("result");
// 添加规则集名称
String ruleSetName = rulesetPath.split("/")[2];
result.setRuleSetName(ruleSetName);
long cost = System.currentTimeMillis() - beginTime;
String performInfo = policy.getPerformInfo();
performInfo += "规则库[" + rulesetPath + "]执行时间:" + cost + "n";
System.out.println("规则库[" + rulesetPath + "]执行时间:" + cost + "n");
policy.setPerformInfo(performInfo);
return result;
小弟基础比较薄弱,对内存这快不是很明白,请大虾 帮忙看下有什么的问题
顺便再想问下:
1资源适配器中 线程数据的大小 正常配置的是多少?
2 WAS 中JVM 的堆栈 应当配置多少? 目前 规则库中规则还相对比较少,有80个个规则项目