linux服務器只部署了2個項目,卻時常內存占滿的問題解決路程


問題場景

公司linux服務器老是內存不夠用,但是實際部署在上面的java項目只有兩個而已;

問題逐步解決的過程

1.剛開始的時候發現有幾次used的使用量每隔一段時間就增加一點,而停用tomat的時候就會減少很多,再加上服務器上的日志爆出了 堆棧溢出的異常,通過jdk中的工具的分析,發現了是執行查詢計划語句的問題(因為我們項目是ssh項目,而我們在項目中大多使用了hql以及原生sql語句來做查詢,但是由於經驗缺少的原因,除了hql是使用占位符來填入可變變量的,原生sql是直接通過字符串拼接的,結果這種無心的操作居然造成了堆棧溢出,因為這些可變的變量被拼裝起來的語句,就會使得這一個語句結果變成不同的字符串變量,而hibernate本身會緩存執行計划,所以就會因為存儲的變量過多而導致內存消耗,堆棧溢出);解決完這個問題后,項目似乎並沒有像這樣子頻繁的出現內存不夠用的情況了

一段時間的風平浪靜后,隨之而來的狂狼總是讓人措手不及~~

2.used又狂飆了,這一次通過top命令,我發現了奇怪的現象,我發現里面運行的java項目居然不只是2個而已,居然有8個,8個呀,我真的是一臉懵逼~~~~,后來為了確認是不是我看錯了,我使用了命令 ps -ef|grep java | grep catalina 來查看我們的tomcat下面到底運行了多少個java進程,結果不得了,居然真的有8個,當時的下巴直往下掉,就像湯姆貓吃驚的表情一樣T_T, 為此我腦中飄過一個疑問,我每次發布項目都是先關閉tomcat再上傳項目war包,再啟動tomcat的,照理說之前的java進程應該會隨着tomcat的關閉同時關閉掉的,為什么會成為一個僵屍進程呢? 懷抱疑問,我投入了度娘的懷抱。通過網絡博文,以及結合自身項目在這段期間的修改找到了問題的原因,而這個原因居然和定時任務有關,原因是定時任務其實就是一個用戶線程,而我們代碼中使用了多個定時任務,它們並不會隨着web容器關閉而銷毀,這就導致了這些java進程最終變成僵屍進程在系統中,蠶食着那微薄的內存空間了,而作為解決方案就是設置關閉鈎子,以此當web容器關閉的時候,通過這個來關閉那些定時任務。或者就是每次關閉tomcat的時候,通過kill命令關閉那些仍然運行着的java進程。為了快速解決內存不足的問題,我選擇了后者,因為畢竟項目並不多,先以簡單的方式解決這個重要緊急的問題,通過kill然后再部署項目,結果發現,我們的項目的內存占用簡直就是一丟丟呀,啊~,這是相當的幸福啊,看到還剩這么多內存的時候,我的心終於放下了,畢竟之前老是各個1-2個新奇,或者2個月左右掛掉,現在也已經逐漸穩定了。

 

感恩這段的經歷,成為了我寶貴的財富,感恩提供文章的那些作者,造福了我們這些后輩,感恩遇到的一切。

參考文章:

https://blog.csdn.net/will_awoke/article/details/38338519?utm_source=tuicool&utm_medium=referral

https://www.cnblogs.com/sxdcgaq8080/p/10734752.html


免責聲明!

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



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