记录一次服务器内存溢出
事先声明,我是一个快乐的java coder,不是运维,吼吼。
2015-08-03 晚,在阿里云上创建了一个centos(1核1G内存)实例,准备搭建一个简单java环境,环境如下:
1、jdk1.6-45(64bit-系统服务)
2、mysql5.5(64bit-系统服务)
3、memcached1.4.4-14(64bit-系统服务)
4、nginx1.8.0系统服务
5、tomcat6.0.44:做了集群,copy了三份:
5i-admin01:端口8201
5i-net01:端口8211
5i-net02:端口8212
然后顺便书写了tomcat启动脚本,测试下start、stop、restart命令。
配置nginx,配置mysql等等;
至此,简单的java环境基本搭建OK了。
但是,奇怪的事情发生了,启动5i-admin01和5i-net01成功,但是启动5i-net02居然失败了,内存不足,我可是1G啊况且只启动三个tomcat,没道理啊,各种优化,清理进程,OK,5i-net02启动成功了。然后启动项目中多线程爬虫,爬取数据到我的数据库中(我全站静态化,静态化的数据全部从互联网通过爬虫爬过来)……pia……爬虫项目挂了……重启,启动爬虫线程……pia……爬虫项目又挂了……反反复复,同事要去吃饭,暂时搁置了。
2015-08-03 18:20 ,今晚下班,迅速出门吃饭回来,准备大干一场,解决这么个玩意儿。
第一步,我想既然内存不足,那么这1G内存都被谁给吃了?直接来命令:
# top 按键大写M
在进程列表打开的一瞬间,茅塞顿开,列表中存在5个java进程,每个占用约150M内存,OK,记录下进程的PID;
第二步,查看进程的来源
既然是java进程,而我服务器暂时只安装tomcat这一个会启动进程的容易,没跑的,就是它了,但是为了确定我还是做了下面一部,查看进程来源;
# netstat -ntlp
在第一步中记录的PID,在新打开的端口列表中查找,果然找到了对应的端口号,8080,8081等等。
至此真想大白,这些java进程是运行中的tomcat,是我在测试tomcat启动脚本的时候,启动的一些进程,但是都没有关闭,因此一直占据着大量内存不释放,OK,至此解决方案就很明晰了;
第三步:杀掉无用进程
# kill 9 PID
整个世界一下子就清爽了,内存占用一下子从950M降到了200M。然后,重启三个项目,开启爬虫,cool,十分钟之内5000条记录轻松记录到数据库,而内存占用一直维持在500M,即使在多线程爬虫工作的时候(访问地址见我的另一篇文章:一个有意思的网站)。