# 东方通开启自动部署导致应用启动后频繁GC
# 问题现象
项目上反馈程序启动需要二三十分钟,每次启动到某个位置就卡着十几分钟之后才能正常访问。
# 排查过程
1、检查ctp日志和东方通server.log,查找启动线程结束时间,发现启动只用了6分钟,之后日志提示已经正常启动完成,且capability日志等已经有用户请求进来,但用户反馈这时还无法访问登录。
2、部署SeeyonDumpTools跟踪,检查启动后的dump日志(oaStatus_xxxx.htm),发现启动后的GC次数和时间非常高,具体表现在程序
- 9点48启动完的,9点51 old gc是 32次
- 到9点52,有38次了,时间增加了43秒
- 一直到10点16分41秒,总共gc 206次,耗时1574秒
3、由此现象可以判断,启动后程序不断GC才导致应用无法正常访问;
联系客开确认客开代码中是否有添加主动GC的动作,客开检查未发现;试用arthas工具跟踪gc动作
具体步骤:
- 上传arthas工具到服务器,并解压
- 重启东方通,查看东方通的进程号,记录下来,假设是 1231
- 进入arthas解压目录,假设jdk路径是 /opt/jdk/, 执行命令
/opt/jdk/bin/java -jar arthas-boot.jar 1231
,会进入arthas命令行界面 - 执行
options unsafe true
- 等到启动完成(5分钟左右),执行
stack java.lang.System gc > /tmp/gc_stack.txt
- 等一分钟检查
/tmp/gc_stack.txt
的内容
这里可以看到System.gc与东方通自动部署有关,联系东方通技术协助排查
经东方通排查发现,启用了自动部署功能:
该功能会使tongweb一直监控自动部署目录,非常耗费性能,然后文件只要发生变化,都要重新发布,这个过程也会很耗性能
# 解决方法
编辑配置文件,节点目录/conf/tongweb.xml
,将自动部署改为false
<auto-deploy enabled="false"
修改后客户验证重启6、7分钟后即可正常访问。
编撰人:wangyxyf
