定位思路
Java程序未符合业务执行,程序挂死。定位思路如图1所示。
图1 Java进程挂死问题定位思路
- 根据业务日志报错信息初步确定问题。
- x86与鲲鹏进行对比分析。
- 同等条件下x86是否存在挂死问题。
- 增大内存参数能否复现问题。
根据以上两步排除是否代码逻辑导致的缺陷问题。
- 对比JVM差异,如默认参数,确认是否存在差异,分析差异点对程序的影响。
- 调整差异点,使鲲鹏平台与x86平台保持一致,验证问题是否解决。
案例
问题现象:
某软件移植到鲲鹏服务器后,压测3小时多可用内存耗尽,鲲鹏上服务主进程挂死,但x86下压测8小时无异常。
定位过程:
- 根据内存监控,鲲鹏下CPU使用稳定,内存在一段时间后趋于临界值。
- 鲲鹏环境与x86环境对比分析,两个环境硬件标配,无差异。
x86下运行稳定,无内存泄漏问题,鲲鹏与x86使用相同的代码,可暂时排除内存泄漏问题导致的内存不够用。
- 鲲鹏上配置为最大内存,测试后未出现挂死现象:内存泄漏问题可能性很小。
- 全面对比JVM运行参数信息,查找差异点,重点关注和内存相关的内容,包括GC参数和空间分配参数。
- 相同点:启动参数一致,GC配置一致。
- 差异点:线程栈默认参数不一致,鲲鹏为2048,x86为1024,按照内存使用情况分析,鲲鹏上能够多启动450个线程,相应的多占用450MB内存,按照比例估算,实际使用内存会超过当前最大内存设定值的95%,可能会引发OOM挂死。
- 修改线程栈大小为1024,长稳测试后,问题不复现。
