鲲鹏社区首页
中文
注册
开发者
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

Java进程挂死

定位思路

Java程序未符合业务执行,程序挂死。定位思路如图1所示。

图1 Java进程挂死问题定位思路
  1. 根据业务日志报错信息初步确定问题。
  2. x86与鲲鹏进行对比分析。
    1. 同等条件下x86是否存在挂死问题。
    2. 增大内存参数能否复现问题。

    根据以上两步排除是否代码逻辑导致的缺陷问题。

  3. 对比JVM差异,如默认参数,确认是否存在差异,分析差异点对程序的影响。
  4. 调整差异点,使鲲鹏平台与x86平台保持一致,验证问题是否解决。

案例

问题现象:

某软件移植到鲲鹏服务器后,压测3小时多可用内存耗尽,鲲鹏上服务主进程挂死,但x86下压测8小时无异常。

定位过程:

  1. 根据内存监控,鲲鹏下CPU使用稳定,内存在一段时间后趋于临界值。
  2. 鲲鹏环境与x86环境对比分析,两个环境硬件标配,无差异。

    x86下运行稳定,无内存泄漏问题,鲲鹏与x86使用相同的代码,可暂时排除内存泄漏问题导致的内存不够用。

  3. 鲲鹏上配置为最大内存,测试后未出现挂死现象:内存泄漏问题可能性很小。
  4. 全面对比JVM运行参数信息,查找差异点,重点关注和内存相关的内容,包括GC参数和空间分配参数。
    • 相同点:启动参数一致,GC配置一致。
    • 差异点:线程栈默认参数不一致,鲲鹏为2048,x86为1024,按照内存使用情况分析,鲲鹏上能够多启动450个线程,相应的多占用450MB内存,按照比例估算,实际使用内存会超过当前最大内存设定值的95%,可能会引发OOM挂死。
  5. 修改线程栈大小为1024,长稳测试后,问题不复现。