案例背景

环境:Linux + WAS 6.1 + DB2 9.5
问题描述:功能测试组反馈某业务一点击,PM服务就挂了。

查看WAS日志和目录,发现出现了内存溢出。

分析过程

先分析javacore文件,发现PM服务的JVM设置为768~1536M。

查看线程信息,发现可疑代码位置:
性能问题分析调优案例第2篇_性能调优案例
该代码应该是正在调用创建流水号的接口方法。

查看堆转储快照,结果显示String对象占了500多M,达到285万个左右。
性能问题分析调优案例第2篇_性能调优案例_02

查看程序代码,在CmPmFrmFundService.setFrmSerialNo(CmPmFrmFundService.java:1227)位置,发现了可能存在问题的代码。

PM在调用CM流水号接口的时候,把当前编号作为参数传过去,而流水号接口用这个编号创建了一个字符串数组,该数组的大小=该编号。

性能问题分析调优案例第2篇_性能调优案例_03

性能问题分析调优案例第2篇_性能调优案例_04

因此,到这里就知道了,是由于PM调用CM接口时,传递了错误的参数,导致流水号方法创建了一个超级大的数组,然后内存溢出了。

解决问题

开发修复代码。