天天看點

利用S_MEMORY_INSPECTOR分析記憶體洩漏問題

我在批量生成service order時,report運作幾個小時後,遇到out of memory exception:

利用S_MEMORY_INSPECTOR分析記憶體洩漏問題
利用S_MEMORY_INSPECTOR分析記憶體洩漏問題

SM04裡發現我的report随着時間的推移,消耗的記憶體越來越多:

利用S_MEMORY_INSPECTOR分析記憶體洩漏問題
利用S_MEMORY_INSPECTOR分析記憶體洩漏問題
利用S_MEMORY_INSPECTOR分析記憶體洩漏問題

如何找到出現memory leak的代碼的準确位置?

我的report裡有個package size,類似于OPEN CURSOR和FETCH的design,比如package size是1000,那麼每1000個service order建立成功後,清一次buffer,然後建立第二批1000個order,再清第二次buffer.

是以我隻需要在兩次清buffer之後分别建立一個memory snapshot:

利用S_MEMORY_INSPECTOR分析記憶體洩漏問題

建立好之後tcode S_MEMORY_INSPECTOR, 比較兩個snapshot裡的delta部分,即為引起memory leak的變量。這個transaction列出了變量所在的program name,剩下的事情就是去找能清除這些變量對應的API.

利用S_MEMORY_INSPECTOR分析記憶體洩漏問題

修改完之後成效顯著,修改之前一個user session跑一個小時記憶體consumtpion就超過了7GB,現在跑了一下午,每個session不超過2GB了。

利用S_MEMORY_INSPECTOR分析記憶體洩漏問題

繼續閱讀