错误日志
现象
错误出现后,系统外部无法正常访问,系统内部服务未发生特殊其他异常。内存占用过高为正常的4倍左右。
解决过程
解决过程A
问题发生后,为了保障项目运行,直接重新启动服务,服务启动后2分钟内内存开始异常增加,之后变为缓慢增加。
开始检查日志,和相应上下文的服务过程。逐一排查,是否存在文件流释放问题。过了半小时系统又挂掉,对比上下文日志,无关联。copy一个服务在模拟环境运行,发现无服务执行也会同样增加内存,会逐步增加。
开始分析运行进程,其中涉及的内容有top、jmap、jstack,查看相应堆栈信息后,无发现特殊内容。
又使用第三方的阿里提供的Arthas。诊断内容发现堆栈内存占用过高,但是无法分析具体是哪些内容造成的,造成原因的open files 经检查过程中最大为2w+,但是最大设置的未6w+。为了大致分析判断哪些内容占用了内存,使用jmap导出了dump文件,使用本地的jvm分析工具进行分析判断,查看得出byte[]类型占用了一半内存且持续增加。随机检查系统中的服务,判断具体类型关联性,将文件交互排除后,无其他进展。
Arthas 是 Alibaba 开源的 Java 诊断工具。
解决过程B
为了进一步排除系统服务问题,将日志设置为最低级别all,在服务进行到2分钟后,开始出现异常反应,异常信息为请求到其他系统的服务超时且每秒中多次请求,日志级别为error,原此服务的日志级别为off(因特殊原因),请求的连接数持续正常,释放不足,导致内存为保持连接持续增加消耗,最终导致Too many open files异常信息。