在做 ABAP 开发或 SAP Basis 性能分析时,很多内存相关的疑问并不是内存不够这么简单:同一台应用服务器上,几十上百个 Work Process 并发跑着不同用户的不同事务码,为什么有些对象能被所有进程共享,有些对象却只能在某个进程里活着?又为什么你在一个事务里跳转、返回、再跳转,内存看起来像叠盘子一样越叠越高?
把这两个问题放在一起看,会更清晰:Shared Memory解决的是多个进程如何共同读取同一份数据;IMODE解决的是同一个用户会话里,事务嵌套调用如何保留与恢复上下文。它们看似是两条线,实际上在 ST02 的Mode List里会交汇成一张非常直观的地图。下面就沿着这张地图,把概念、机制、排查方法、开发侧的写法建议串起来。
Shared Memory 到底shared在哪里
共享 vs 私有:不是有没有权限,而是能不能被别的进程寻址
SAP 里的内存可以粗暴分成两类:
- Private Memory(私有内存):只属于创建它的那个进程(更准确说是那个 Work Process 的地址空间或其私有段)。别的进程即使知道你放了什么,也没法直接