記錄一次服務器內存溢出


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM