项目场景:
项目场景:
公司开始全面拥抱阿里云,接入SLS、ARMS等项目管理服务。
问题描述
问题就来了,之前很少卡顿(但是也不快)的老项目竟然挂了,延迟到无法使用的程度!领导很生气,问题很严重。组织了一堆P7&P6彻夜排查。
查看服务器的日志、资源状态发现,发生了频繁的full gc,JVM内存给的绝对够了,经排查在full gc之前总会打印一行 stackOverFlow。。。
原因分析:
排查过程忽略不计,最后是发现老项目的自定义异常类重写了getCause()
public Throwable getCause() {
return cause;
}
当手动抛异常并且catch后重新抛出时。。。
陷入自我递归getCause中。。。
没接arms之前还好,接后arms内存溢出了。。。
所以啊,接arms要保证项目的质量是合格的。。。
解决方案:
解决很简单,终止自我递归就好喽。。
public Throwable getCause() {
return (cause==this ? null : cause);
}
重新上线,恢复正常。呼,不要生气不要生气不要生气。。。