一、內存調優
什么是內存泄漏
監控Java內存的常用工具
內存泄露的常見場景
內存泄露的解決方案
內存泄露與內存溢出的區別
內存泄露:在Java中如果不再使用一個對象,但是該對象依然在GC ROOT的引用鏈上,這個對象就不會被垃圾回收器回收,這種情況稱之為內存泄露。
少量的內存泄露可以容忍,但是如果發生持續的內存泄露,就像滾雪球,雪球約滾約大,不管有多大的內存遲早會被消耗完,最終導致的結果就是內存溢出。但是產生內存溢出并不是只有內存泄露這一種原因。
內存泄露的常見場景
1、內存泄露導致溢出的常見場景是大型的Java后端應用中,在處理用戶的請求之后,沒有及時將用戶的數據刪除。隨著用戶請求數量越來越多,內存泄露的對象占滿了對內存最終導致內存溢出。
這種產生的內存溢出會直接導致用戶請求無法處理,影響用戶的正常使用。重啟可以恢復應用使用,但是在運行一段時間之后依然會出現內存溢出。
2、第二種常見場景是分布式任務調度系統如Elastic-job、Quartz等進行任務調度時,被調度的Java應用在調度任務結束中,如果出現了內存泄露,最終導致多次調度之后內存溢出。
這種產生的內存溢出會導致應用執行下次的調度任務執行。同樣重啟可以恢復應用使用,但是在調度執行一段時間后依然會出現內存溢出。
解決內存溢出的方法
解決內存溢出的步驟總共分為四個步驟,其中前兩個步驟是最核心的。
發現問題-Top命令
top命令,實時查看系統的資源,比如執行時的進程、線程和系統參數等信息。
load average 分別代表過去 1分鐘 5分鐘 15分鐘的系統負載,什么是系統的負載,多核cpu,百分之二, 百分之十 、百分之六
進程使用的內存為RES(常駐內存)-SHR(共享內存)
優點:操作簡單、無額外的軟件安裝
缺點:只能查看最基礎的進程信息,無法查看到每個部分的內存占用(堆、方法區、堆外)