上周积分数据库进行了升级
相应的加减积分的程序也进行了修改
升级过程相对顺利,很快就完成
但自从升级后
积分的服务器就不断的报警重启
几乎每小时都会重启一次

开始怀疑是程序有问题,造成内存泄露
于是,查找resin的log
但也没有发现里面有out of memory的错误
在resin的jvm和stderr的日志里几乎看不到任何有用的信息
只有不断的重启的log

于是,想看看resin的status
在服务器上打开了ResinStatusServlet,配置了一个url
结果,看到的一切似乎都正常
Threads和Total Memory都没有异常
resin的status看不出问题

然后,又把Apache的info status给打开
在extra/httpd-info中打开server-status
配置一个url(要注意Allow权限的问题,不能让外部的用户看到这个页面)
访问后,发现了里面有很多的W
而且随着时间的推移,W越来越多
而W代表是Sending Reply
说明是程序在某个地方堵塞了
然后看到W的url都是某个Action
呵呵,到此基本就找到了问题所在的Class了

然后,再查找该Action对应的Log
发现在减积分的地方没有任何输出
再查看减积分的服务,果然发现很多的Exception
到此,就定位到了真正的问题了

于是,查找减积分的Bug
修改后再上线
服务器就正常了

另:如果从resin的status中看出有内存泄露
那么可能就需要利用第三方的工具
如JConsole,JProfile来定位到底是哪个Class造成的内存泄露了

整个查找问题,发现问题,解决问题的过程
看似挺复杂的,但基本都是这样的一个套路
只要遵从一定的流程和方法
一般都能顺利解决的