問題場景html
公司linux服務器總是內存不夠用,可是實際部署在上面的java項目只有兩個而已;java
問題逐步解決的過程linux
1.剛開始的時候發現有幾回used的使用量每隔一段時間就增長一點,而停用tomat的時候就會減小不少,再加上服務器上的日誌爆出了 堆棧溢出的異常,經過jdk中的工具的分析,發現了是執行查詢計劃語句的問題(由於咱們項目是ssh項目,而咱們在項目中大多使用了hql以及原生sql語句來作查詢,可是因爲經驗缺乏的緣由,除了hql是使用佔位符來填入可變變量的,原生sql是直接經過字符串拼接的,結果這種無意的操做竟然形成了堆棧溢出,由於這些可變的變量被拼裝起來的語句,就會使得這一個語句結果變成不一樣的字符串變量,而hibernate自己會緩存執行計劃,因此就會由於存儲的變量過多而致使內存消耗,堆棧溢出);解決完這個問題後,項目彷佛並無像這樣子頻繁的出現內存不夠用的狀況了web
一段時間的風平浪靜後,隨之而來的狂狼老是讓人措手不及~~sql
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個月左右掛掉,如今也已經逐漸穩定了。緩存
感恩這段的經歷,成爲了我寶貴的財富,感恩提供文章的那些做者,造福了咱們這些後輩,感恩遇到的一切。tomcat
參考文章:服務器
https://blog.csdn.net/will_awoke/article/details/38338519?utm_source=tuicool&utm_medium=referral網絡
https://www.cnblogs.com/sxdcgaq8080/p/10734752.htmlssh