场景:测试服务器上,在未停止tomcat的情况下直接修改了配置文件(properties文件),稍后再有请求进来时(该请求会使用到properties文件中的属性),引发了OOM
tomcat7.0.50配置文件:
conf/server.xml中:
<Context docBase="advertise-war" path="/advertise-war" reloadable="true" />
path: 访问该Web应用的URL入口
reloadable:tomcat在运行时会监控 WEB-INF/classes 和 WEB-INF/lib目录下的class文件,如果监测到有class文件被更新的,tomcat会自动重新加载(先卸载,再部署)Web应用。
分析:
1)在卸载的过程中,(大概是由于文件被修改后)程序可能出错,导致原来的web应用卸载失败,从而导致原来的web应用仍然存在于Tomcat的缓存之中。
2)虽然卸载失败,但是tomcat仍然会部署修改后的web应用。
3)从而导致:tomcat在重新部署web应用时,由于无法删除已有的缓存,故可能会出现内存溢出的异常。
建议:
1)将reloadable属性设为false。
2)使用分布式配置中心来解决这个问题。