事先聲明,我是一個快樂的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,即使在多線程爬蟲工作的時候(訪問地址見我的另一篇文章:一個有意思的網站)。
