1. 程式人生 > >記憶體管理(SAP和ABAP記憶體)快取設定以及程式memory管理等

記憶體管理(SAP和ABAP記憶體)快取設定以及程式memory管理等

記憶體有兩種,一種是SAP記憶體,一種是ABAP記憶體:(這兩種記憶體都是針對同一個使用者,如果要針對不用使用者就要使用共享object,請參考後面內容


他們兩者的關係如下圖:

 

還有一個概念需要理解的:

使用者登陸後,最多一個系統可以開6個視窗,這在SAP中稱為External Mode。
而同一個視窗中,執行某程式後,可以通過CALL TRANSACTION/SUBMIT或其他程式碼跳轉到其他程式,這個稱為Internal Mode。Internal Mode的呼叫棧最多為9層。
那麼ABAP Memory,它是屬於Internal Mode間可以共享的資料,而External Mode間無法共享。SAP Memory就可以呼叫不同session的。

1、ABAP記憶體:

              通過EXPORT,IMPORT實現。同一個session(一個視窗)才可以。如果是不同session,必須在另外一個程式通過submit,call transaction呼叫,然後才可以實現記憶體傳輸。實現方法如下:


例子. 建立程式A,輸入:
DATA matnr TYPE matnr.
IMPORT matnr FROM MEMORY ID 'YTEST_MATNR'.
WRITE matnr.
建立程式B,輸入:
DATA matnr TYPE matnr.
matnr = '000000000000001234'.
EXPORT matnr TO MEMORY ID 'YTEST_MATNR'.
SUBMIT y_program_a. "呼叫程式A
直接執行B,發現程式A從ABAP Memory讀到了值並輸出到LIST.

說明:
(1)除錯執行B到EXPORT語句後面,Goto-System Area-ABAP Memory,可以檢視到名為YTEST_MATNR的一片記憶體。
(2)如果B和A執行在不同的視窗,則A將訪問不到資料;當用戶輸入/N退出當前程式時,記憶體值也將被清空。
(3)該語句適用於CALL TRANSACTION/SUBMIT過程中的資料共享,也常用於User Exit,類似於定義全域性變數的效果。

2、SAP記憶體:

      不同程式都可以讀取,通過  SET PARAMETER ID....FIELD...() 實現:


上面說了External Mode,那麼它們之間共享資料必須通過SET/GET PARAMETER語句,不再是EXPORT/IMPORT的模式。
 
例子. 建立程式A,輸入:
DATA matnr TYPE matnr.
GET PARAMETER ID 'YTEST' FIELD matnr.
WRITE matnr.
建立程式B,輸入:
DATA: matnr TYPE matnr.
matnr = '000000000000012345'.
SET PARAMETER ID 'YTEST' FIELD matnr.
在視窗1執行程式B並關閉後,在視窗2執行程式A,發現程式A仍然讀到了SAP Memory的值。
 
說明:
(1)除錯時,可通過Goto-System Area-SAP Memory,檢視到YTEST及其對應的值。
(2)SET/GET PARAMETER的值與本次登陸有關,當用戶登出後才失效。在使用者登陸的時候,系統會根據每個使用者User Profile-Own Data-Parameter下的設定,載入到SAP Memory。
(3)Data Element中可以看到Further Characteristics下可定義PARAMETER ID,代表該欄位作為螢幕元素時,可讀取該PARAMETER ID作為預設值。比如VA03會自動顯示剛剛建立的訂單號。

3、不同使用者的記憶體管理SHARED MEMORY/SHARED BUFFER:

有一個概念要理解:
前面介紹的都是使用者記憶體,那麼不同使用者間如何實現資料共享呢?可以用SHARED MEMORY或SHARED BUFFER,它們是伺服器上的某片所有使用者共享的記憶體。關於SHARED MEMORY和SHARED BUFFER的區別,可以F1檢視幫助。如果EXPORT SHARED BUFFER,則必須IMPORT SHARED BUFFER才能讀到,用IMPORT SHARED MEMORY是讀不到的。反過來也是。


例子. 建立程式A,輸入: 
DATA matnr TYPE matnr.
IMPORT matnr FROM SHARED BUFFER indx(aa) ID 'YTEST_MATNR'.
WRITE matnr.
建立程式B,輸入:
DATA: matnr TYPE matnr.
matnr = '000000000000123456'.
EXPORT matnr TO SHARED BUFFER indx(aa) ID 'YTEST_MATNR'.
先在使用者1的電腦上執行程式B,然後在使用者2的電腦上執行程式A,發現使用者2可以讀取到值。


說明:
(1)既然是伺服器上的所有使用者共享空間,那麼該值將儲存到伺服器關機重啟為止,除非使用者用DELETE語句清除它。其實這個跟ENQUEUE/DEQUEUE有點相似之處。
(2)資料庫也可共享資料,不過伺服器共享肯定速度快些,理論上適合網路遊戲,呵呵。
(3)INDX是系統中存在的符合特定格式要求的表。但這不代表該EXPORT/IMPORT語句將在表INDX中增加記錄,僅僅代表伺服器借用了INDX的結構來管理該片共享記憶體。

上面說了SHARED BUFFER並不訪問資料庫,而要訪問資料庫就應該用DATABASE。
 
建立一個程式,錄入程式碼:
DATA: matnr TYPE matnr.
matnr = '000000000000004321'.
EXPORT matnr TO DATABASE indx(aa) ID 'YTEST_MATNR'.
 
執行程式,然後SE16查看錶INDX,發現新增了一條RELID = AA, SRTFD = YTEST_MATNR的記錄。如果EXPORT的資料量比較大,則新增的將是多條,這些條目的欄位值SRTF2從0遞增。所以EXPORT DATABASE與普通資料庫操作的不同之處是,它適合大資料量的操作,系統自動將其拆分成多條記錄並存儲到資料庫中,比如圖片或文件。而用IMPORT DATABASE的過程則相反,系統將把這些條相關記錄又自動組合起來成為一個整體。

4、快取:

如果表有設定快取,那麼第二次讀取的時候就會到快取裡讀取。
不頻繁修改的可以設定快取。:如果資料庫表被刪掉,但是快取裡面還儲存有的話,,就會導致有錯。
never buffer transaction data/master data
快取是更新到自己的應用伺服器上

5、程式memory管理:

memory分析:
debug後,通過memory snapshot儲存後,通過下面t-code去分析記憶體
S_MEMORY_INSPECTOR
不用的,要free,釋放記憶體。那些是佔記憶體的?