記憶體洩漏是一種常見會造成系統效能衰退或是使系統當掉的程式漏洞。記憶體洩漏也是導致軟體老化常見的原因。在C/C++的程式語言中,由於程式設計師必須手動管理記憶體的使用情況,因此常會造成記憶體資源使用上的問題。然而,許多人會認為Java有提供自動化垃圾回收(Automatic Garbage Collection)的機制,使用者不需要花費更多的時間去管理記憶體的使用情況,因此就不會產生記憶體洩漏的情況。但是事實並非如此,在Java中確實還是會有產生記憶體洩漏的情況。其產生記憶體洩漏的原因主要是記憶體物件仍有指標參考到,因此這個物件無法回收,但是這個物件卻在之後都不會用到,也就是此物件既無用又無法回收。
本研究的目的主要是透過物件的成長趨勢來找出疑似在記憶體使用上有問題的物件。首先,本研究先監控每次full gc後堆(heap)中的記憶體物件的成長情況並將疑似在記憶體管理上有問題的程式找出來。接下來針對這些有問題的程式,每隔固定時間便觀察且紀錄堆(heap)中每個物件的成長趨勢。然後透過時間序列分析偵測出在記憶體使用上有問題的物件。將本研究所出的方法運用在四支有記憶體洩漏的四支Java程式上,確實能夠將洩漏物件過濾出來。
|