我在批量生成service order時,report運作幾個小時後,遇到out of memory exception:
SM04裡發現我的report随着時間的推移,消耗的記憶體越來越多:
如何找到出現memory leak的代碼的準确位置?
我的report裡有個package size,類似于OPEN CURSOR和FETCH的design,比如package size是1000,那麼每1000個service order建立成功後,清一次buffer,然後建立第二批1000個order,再清第二次buffer.
是以我隻需要在兩次清buffer之後分别建立一個memory snapshot:
建立好之後tcode S_MEMORY_INSPECTOR, 比較兩個snapshot裡的delta部分,即為引起memory leak的變量。這個transaction列出了變量所在的program name,剩下的事情就是去找能清除這些變量對應的API.
修改完之後成效顯著,修改之前一個user session跑一個小時記憶體consumtpion就超過了7GB,現在跑了一下午,每個session不超過2GB了。