【06】SAP ABAP性能优化 - 内存管理 (ABAP Memory vs. SAP Memory)

1. 基础知识:

ABAP程序在首次执行前(或新版本激活后,再次执行时),会经历编译的过程,生成一个可执行对象LOAD, 这个可执行对象是存储在应用服务器AS的buffer里的。

其实对于运行环境而言,ABAP程序由两部分组成:一部分是固定不可修改的,例如编译后的可执行代码、程序中的文本、常量等等,这些内容会存储在PXA(Program Execution Area)中。另一部分,对程序而言,是可能发生变化的内容,例如程序运行中的变量等,这一部分的内容会存储在Roll Area中。

当同一个程序被并发执行多次时(被1个User同时执行多次,或者多个User同时并发单独执行),都会为每次一运行分配独立的Roll Area. 这也就是不同user同时执行一个相同的程序时,并不会相互干扰的原因。

2. External Session vs. Internal Session

学习ABAP Memory和SAP Memory,首先要区分External Session和Internal Session的概念。

  • External Session: 一个External Session就是一个独立的GUI Window. 在SAP GUI中默认定义最大可有6个External Session,也即最多可以有6个独立的GUI Window。当然,这个是可以由Basis配置的,因为在SAP NW 7.0以上的版本,最多可以支持16个External Session。
  • Internal Session:在一个External Session中,又可以有多个Internal Session。在ABAP程序中,可以通过SUBMIT, CALL TRANSACTION等方式产生新的internal session,系统对于每一个Internal Session会分配单独的Roll Area。ABAP中,在一个program中,最多可以有9个Internal Session.

产生Internal Session的语法,区别如下:

执行完会返回 执行完不会返回
SUBMIT program_name AND RETURN SUBMIT program_name **
CALL TRANSACTION tran_name LEAVE TO TRANSACTION tran_name

3. ABAP Memory vs. SAP Memory

ABAP Memory是Internal Session间可共有的内存空间;而SAP Memory是External Session间可共有的内存空间,它们的关系见下图:
【06】SAP ABAP性能优化 - 内存管理 (ABAP Memory vs. SAP Memory)_第1张图片
可以使用ABAP在Internal Session见进行数据传递,当前Session结束后,ABAP Memory会自动释放。

可以使用FREE MEMORY ID xxx的方式进行手动释放。

下面给出了一个利用ABAP memory进行数据传递的例子。

REPORT ztest_calculate_main.
**********************************************************************
* ABAP Memory
**********************************************************************
DATA: lv_a TYPE i,
      lv_b TYPE i.

lv_a = 1.
lv_b = 2.

EXPORT val_1 = lv_a
       val_2 = lv_b
       TO MEMORY ID 'test_val_id'.

SUBMIT ztest_calculate AND RETURN.

WRITE: / 'run successfully.'.
REPORT ztest_calculate.

DATA: lv_val_1 TYPE i,
      lv_val_2 TYPE i,
      lv_sum   TYPE i.

IMPORT val_1 = lv_val_1
       val_2 = lv_val_2
       FROM MEMORY ID 'test_val_id'.

lv_sum = lv_val_1 + lv_val_2.

WRITE:/ 'result = ', lv_sum.

可以使用SAP Memory在External Session间进行数据传递,例如在SU3中维护的user parameter其实就是使用的SAP Memory。

SAP Memory在user退出系统登录后自动释放。

** In external session 1 - Set 
DATA: ls_bkpf TYPE bkpf.
  SET PARAMETER ID 'BUK' FIELD ls_bkpf-bukrs.


** In external session 2 - Get 
DATA: ls_header TYPE bkpf.
  Get PARAMETER ID 'BUK' FIELD ls_header-bukrs.

当然,也可以使用SAP Memory在Internal Session间进行值的传递,如下例:

**********************************************************************
* SAP Memory
**********************************************************************
DATA: ls_bkpf TYPE bkpf.

SELECT * FROM bkpf INTO ls_bkpf
  UP TO 1 ROWS
  WHERE gjahr = 2018.
ENDSELECT.
IF sy-subrc = 0.
  SET PARAMETER: ID 'BUK' FIELD ls_bkpf-bukrs,
                 ID 'BLN' FIELD ls_bkpf-belnr,
                 ID 'GJR' FIELD ls_bkpf-gjahr.
  CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
ENDIF.

WRITE: / 'back from FB03'.

你可能感兴趣的:(SAP,ABAP性能优化,SAP,ABAP,性能优化)