OOM問題解決實踐

效能優化實踐者發表於2021-11-16

一、專案背景

我們的專案是一款致力於解決大學課堂教學效率低下、教師學生課堂教學互動性不強這一現實問題而設計的獨立的課堂教學輔助系統。系統主體分為兩個相互關聯的軟體。E課的pc端的使用者是大學授課教師,E課APP是服務學生的Android端軟體。“E課”軟體PC端的使用者是大學授課教師,基於授課需要,教師需要考察學生出勤情況,瞭解學生課堂實時學習情況,展示相關教學資料。“E課”APP的使用者是學生,學生在合適的時間使用手機軟體與教師進行互動,提高課堂效率與課堂互動性。
“E課”是一項獨立的軟體,而且全部內容自含。在“E課”智慧手機應用程式中,教師可通過個人郵箱和密碼登入系統,學生可通過本人學號和加密碼登入系統。顯示頁面所需要的資料全部從資料庫中讀取,以APP介面或者網頁的形式列在頁面上供使用者瀏覽。“E課”可實現課表查詢、掃描二維碼即時簽到、課程檢測、“我要當學霸”、線上課程中心等主要功能以及績點查詢、成績查詢等輔助功能,實現以新媒體輔助教學的方式提高課堂效率。
系統架構圖如下:

學生使用者端主要功能有:加入課程、簽到、課堂檢測、檔案下載、課堂筆記、個人簽到記錄等核心功能,還有大學新聞公告展示推送、學生課表自動匯入及展示、個人資訊、成績查詢等輔助功能。PC端功能總覽圖如下:

二、所遇到的挑戰

本專案在測試及小範圍使用者使用的過程中,發現了會存在OOM 的問題。 OOM,全稱“Out Of Memory”,翻譯成中文就是“記憶體用完了”,即會丟擲java.lang.OutOfMemoryError的異常。看下關於的官方說明: Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector. 意思就是說,當JVM因為沒有足夠的記憶體來為物件分配空間並且垃圾回收器也已經沒有空間可回收時,就會丟擲這個error(注:非exception,因為這個問題已經嚴重到不足以被應用處理)。

三、解決問題的步驟

首先,我們先進行問題的排查,因為發生OOM的可能性和原因有很多。但無外乎底層原因就兩點,一種是分配得少:比如虛擬機器本身可使用的記憶體(一般通過啟動時的VM引數指定)太少;另一種是應用用的太多,並且用完沒釋放,浪費了。此時就會造成記憶體洩露或者記憶體溢位。(記憶體洩露:申請使用完的記憶體沒有釋放,導致虛擬機器不能再次使用該記憶體,此時這段記憶體就洩露了,因為申請者不用了,而又不能被虛擬機器分配給別人用。記憶體溢位:申請的記憶體超出了JVM能提供的記憶體大小,此時稱之為溢位。)
常用的工具有常用的工具有:

1)mat: eclipse memory analyzer, 基於eclipse RCP的記憶體分析工具。詳細資訊參見:http://www.eclipse.org/mat/,推薦使用。 2)jhat:JDK自帶的java heap analyze tool,可以將堆中的物件以html的形式顯示出來,包括物件的數量,大小等等,並支援物件查詢語言OQL,分析相關的應用後,可以通過http://localhost:7000來訪問分析結果。不推薦使用,因為在實際的排查過程中,一般是先在生產環境 dump出檔案來,然後拉到自己的開發機器上分析,所以,不如採用高階的分析工具比如前面的mat來的高效。
進行了幾輪的測試與排查,首先發現是-Xmx 引數過低,調高之後便解決了部分問題;後發現資料庫查詢邏輯有些問題,一次性查詢了資料庫全部結果,而沒有做結果數限制,所以當測試的資料庫資訊量過大的時候,也會出現OOM的問題,於是我們嘗試從邏輯層面優化了資料庫查詢機制,從而又更高層面地減少了OOM問題的發生。
因為發現了軟體潛藏的可能性問題,加強了我們的監控維護意識,畢竟測試只能解決部分和少量非常明顯的問題,但是在實際上線過程中,突然爆發出來的問題可能會是毀滅性的,於是我們決定要完善監控體系。只有這樣,才能更好的服務於使用者,儘快發現問題,並解決例如適配性、使用者體驗、流量使用、穩定性等問題。我們調研了幾個常用的使用者反饋平臺1) 美洽,基於HTML5開發,只需在IOS/Android支援H5的瀏覽器中開啟即可,無需安裝任何軟體程式,程式碼植入,一步到位,簡化溝通流程。
2) Udesk:支援Android、IOS以及APIcloud三大平臺,可以對使用者反饋的資料做統計分析,並展示結果。
3) Freshdesk,致力於中小企業網站線上客服技術支援的網站,提供中小企業網站的線上服務質量和使用者體驗度。在調研過程中,我們偶然接觸到了友盟+ 應用效能監控平臺 U-APM,U-APM應用效能監控平臺提供實時、可靠、全面的應用崩潰、ANR、自定義異常等捕獲能力,支援多場景、多通道智慧告警監控,高效還原崩潰使用者的訪問路徑和業務現場,縮短故障排查時間。其提供從發現問題---還原問題---解決問題----驗收的完整閉環。完美符合我們的需求和預期。

四、專案總結

我們的專案最終定位在“適配普通大學課堂教學的教學輔助軟體”,旨在提高大學課堂效率和教學互動性,在功能層面上儘量做到簡潔,在開發層面儘量做到統一規範。PC端和Android端均符合了MVC軟體設計模式,具有了較好的可移植性,模組之間高度解耦,可適應各種型別的再開發。但在APP測試期間出現了OOM的問題,於是我們通過調高-Xmx引數,並修改了資料庫查詢邏輯,優化程式碼結構,同時完善監控體系的方法解決優化了這個問題,並且完善了監控體系對後續未來可能會發生的問題提供了雙重保障。

相關文章