分类: 系统运维
2012-06-16 14:36:23
上图是sAP 运行时内存,SAP程序运行期间的内存管理与用户会话相关,运行时内存包括SAP内存以及APAP内存两大部分。
首先说一下以下的概念:
1.主会话(main session):用户登录SAP系统,便开始了与应用服务器之间的主会话,又称外部会话。最多打开6个主会话。
2。internal session:主会话中运行可执行程序或者模块池程序,就开始一个内部会话。其中的程序内存区域是主会话abap内存中分配的一部分。在一个主会话中,只有当前程序的内部绘画内存区是活动的,如果当前程序是被其他的程序所调用,内存呈堆栈状,当前程序不能使用其他非活动程序中的数据。
3.ABAP memory:每个主会话内部都有一个ABAP内存区域,可以通过export to memory 和import from memory语句在该内存的程序堆栈之间进行数据传递。如果一个程序内部调用另一个程序,可以先使用export将数据存入内存,在调用程序中通过import语句读取该程序,退出被调用程序前也可以使用个同样方式将数据传回主程序。
4.SAP memory: SAP内存是所有的会话都可以访问的内存区域,因此数据可以通过SAP内存在各个会话之间共享。在ABAP程序中,SET PARAMETER 和 GET PARAMETER语句用于访问SAP内存中所存储的SPA/GPA参数。该参数与屏幕元素相连接,因而可以通过SAP内存进行屏幕的默认参数设定。
其他细节:
调用序列:如果一个程序在运行期间调用其他程序,则可能出现掉哦那个并中止当前程序或调用并返回两种情况。中止当前程序即新程序的内部绘画完全替代调用程序,并将原有程序的内存删除;调用并返回则生成一个调用序列,并生成一个内存堆栈,并调用的程序结束后,将恢复上一级调用程序的内存状态。这样在调用和被调用程序间进行数据传递,需要使用同一个主会话中公用的ABAP内存。
程序装载:每次开始运行或者调用一个abap程序时,系统将一个程序实例装载入ABAP内存。在内部绘画中第一个被装载的程序称为主程序。被调用的程序或者全局类,该程序或类的一个实例将被装载至ABAP内存并且相关的数据和对象将保持至主程序结束。每次一个(l,m,f,s类型的)程序实例被装载时,都触发LOAD-OF-PROGRAM事件(类库除外),因此该事件对于每一个程序在内部会话中仅装载一次,可以用整个程序的初始化。
关于对象的创建:当create object语句创建abap对象时,一个类的实例将被装载至内部会话,所有内部会话中的程序和对象都可以使用该实例。从而该对象的指针可以被传递进入外部过程(例如子程序,功能模块和类方法)。应用服务器中没有分配可以被多个事务共享的对象内存区域,对象引用变量不能存储在ABAP内存或者SAP内存中。可以用数据库存储(数据库提供persistence service)解决这个问题。
例:内存程序堆栈之间进行数据传递EXPORT TO MEMORY 和IMPORT FROM MEMORY