案例背景
环境:Linux + WAS 6.1 + DB2 9.5
问题描述:功能测试组反馈某业务一点击,PM服务就挂了。
查看WAS日志和目录,发现出现了内存溢出。
分析过程
先分析javacore文件,发现PM服务的JVM设置为768~1536M。
查看线程信息,发现可疑代码位置:
该代码应该是正在调用创建流水号的接口方法。
查看堆转储快照,结果显示String对象占了500多M,达到285万个左右。
查看程序代码,在CmPmFrmFundService.setFrmSerialNo(CmPmFrmFundService.java:1227)位置,发现了可能存在问题的代码。
PM在调用CM流水号接口的时候,把当前编号作为参数传过去,而流水号接口用这个编号创建了一个字符串数组,该数组的大小=该编号。
因此,到这里就知道了,是由于PM调用CM接口时,传递了错误的参数,导致流水号方法创建了一个超级大的数组,然后内存溢出了。
解决问题
开发修复代码。