1. 程式人生 > 其它 >雲上遷移面臨信任問題,混合雲解決方案是大多數公司的長期選擇

雲上遷移面臨信任問題,混合雲解決方案是大多數公司的長期選擇

何為記憶體洩漏

記憶體洩漏(Memory Leak)是指程式中已動態分配的堆記憶體由於某種原因程式未釋放或無法釋放,造成系統記憶體的浪費,導致程式執行速度減慢甚至系統崩潰等嚴重後果。
以java的角度來分析,就是JVM建立的物件永遠都無法訪問到,但是GC又不能回收物件所佔用的記憶體。少量的記憶體洩漏並不會出現什麼嚴重問題,無非是浪費了一些記憶體資源罷了,但是隨著時間的積累,記憶體洩漏的越來越多就會導致「記憶體溢位」,程式崩潰。GC算中的一種引用計數,當迴圈依賴時,就會造成記憶體洩漏。

幾種典型的記憶體洩漏

  • 全域性集合

在大型應用程式中存在各種各樣的全域性資料倉庫是很普遍的,在這些情況下,必須注意管理儲存庫的大小。必須有某種機制從儲存庫中移除不再需要的資料。常用的兩種管理方式:
1、一種週期執行的清除作業。這個作業會驗證倉庫中的資料然後清除一切不需要的資料。
2、另一種管理儲存庫的方法是使用反向連結(referrer)計數。然後集合負責統計集合中每個入口的反向連結的數目。這要求反向連結告訴集合何時會退出入口。當反向連結數目為零時,該元素就可以從集合中移除了。

  • 快取

 快取一種用來快速查詢已經執行過的操作結果的資料結構。因此,如果一個操作執行需要比較多的資源並會多次被使用,通常做法是把常用的輸入資料的操作結果進行快取,以便在下次呼叫該操作時使用快取的資料。快取通常都是以動態方式實現的,如果快取設定不正確而大量使用快取的話則會出現記憶體溢位的後果,因此需要將所使用的記憶體容量與檢索資料的速度加以平衡。
  常用的解決途徑是將儲存物件繼承java.lang.ref.SoftReference類放入快取。這個方法可以保證當虛擬機器用完記憶體或者需要更多堆的時候,可以釋放這些物件的引用。

  • 類載入器

java類裝載器的使用為記憶體洩漏提供了許多可乘之機。一般來說類裝載器都具有複雜結構,因為類裝載器不僅僅是隻與"常規"物件引用有關,同時也和物件內部的引用有關。比如資料變數,方法和各種類。這意味著只要存在對資料變數,方法,各種類和物件的類裝載器,那麼類裝載器將駐留在JVM中。既然類裝載器可以同很多的類關聯,同時也可以和靜態資料變數關聯,那麼相當多的記憶體就可能發生洩漏。
最典型的一個就是java永久區的大小,當使用載入器不斷熱載入新的類時,若配置了metaspace的大小,就很容易造成記憶體洩漏。