jrule 7.1.1 部署在was 上系统 内存溢出问题

系统环境:

      版本号: 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 inputParameters = sessionRequest
     .getInputParameters();
   
   inputParameters.put("input", policy);
   IlrStatelessSession statelessSession = pojoFactory
     .createStatelessSession();
   
   IlrSessionResponse response = statelessSession
     .execute(sessionRequest);
   
   Map outputParameters = response
     .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个个规则项目







参与2

1同行回答

supertimesupertime软件架构设计师IBM
你得先看一下你目前线程池的使用情况,目前的100个使用了多少。JVM的配置也是需要根据实际需要进行调整的。得看你的应用的数量,以及用户数,系统压力来决定。推荐你看一个文档:http://www-01.ibm.com/support/docview.wss?uid=swg27039844有啥疑问,欢迎讨论~...显示全部
你得先看一下你目前线程池的使用情况,目前的100个使用了多少。
JVM的配置也是需要根据实际需要进行调整的。得看你的应用的数量,以及用户数,系统压力来决定。

推荐你看一个文档:
http://www-01.ibm.com/support/docview.wss?uid=swg27039844

有啥疑问,欢迎讨论~收起
互联网服务 · 2014-07-29
浏览925

提问者

xiaomu
项目经理软件公司

相关问题

问题状态

  • 发布时间:2014-07-18
  • 关注会员:1 人
  • 问题浏览:3706
  • 最近回答:2014-07-29
  • X社区推广