判斷內存性能表現主要是為了解決如下兩個問題:
1. 當前web應用是否存在內存泄漏,如果有,問題的程度有多大?
2. 如果web應用的代碼無法進一步改進,當前web應用所在的服務器是否存在內存上的瓶頸,是否需要增加內存數量來提高內存?
一、內存泄漏及判斷
(一)、什么是內存泄漏?
程序都需要裝載在內存中才能運行,退出的時候將內存返還給系統,有兩種返還方式:
1. 自行返還: 程序員編寫代碼的時候返還,如C++代碼。
2. 自動返還: 由支持程序運行的服務平台定期自動返還給系統,如Java、.Net等。
事實上,無論以上哪種方式,程序都有可能未把自己使用的內存返回給系統,從而導致之后的程序無法再使用這些內存,這些應該返還而沒有返還的內存就像從管道漏掉了一樣。
因為web程序都是持續不斷的運行,如果代碼存在內存泄漏的問題,泄漏的內存就會越來越多,越來越嚴重。導致系統可用的內存資源越來越少,系統性能越來越差,用戶感受到的響應時間越來越慢。
(二)、性能計數器與內存泄漏
關注Process(進程)性能對象的如下幾個計數器:
Handle Count(句柄數量): 進程的每個線程當前打開的句柄總數。
Thread Count(線程數量):線程的總數。
Virtual Bytes(虛擬內存字節數): 見后面關於虛擬內存的說明。
Working Set(工作集): 和當前進程有關的那一部分物理內存。
Private Byte(私有數據字節數): 此進程無法與其他進程共享的字節數量。
虛擬內存: 計算機內存有限,需要使用內存的程序非常多,大家都把需要的代碼和數據全部放在內存中是吃不消的。所以操作系統在磁盤上也為程序開辟一塊存儲的地盤,當作內存使用,這就是虛擬內存。
可能存在內存泄漏的情況:
1. 一般來說:Virtual Bytes 應該遠大於Working Set。如果:Virtual Bytes 增長較快,Working Set增長較少, 則可能存在內存泄漏的情況。
2. 以上所有性能計數器在測試期間數值持續增長,而測試停止后仍然維持在高水平,則可能存在內存泄漏。
(三)、使用工具軟件測試代碼是否存在內存泄漏情況
如JProbe套件、Rational Purify、Leakdiag、BoundsChecker和CLRProfiler等軟件可以在代碼不那么龐大的時候就進行單元測試、組件測試,不讓問題積累起來。