要钻研 SAP ABAP 内表的写时复制(copy on write)机制,ABAP Memory Inspector 是必不可少的工具。

ABAP Memory Inspector 能报告运行 ABAP 程序的外部会话应用的内存。

这个工具能提供下列两个维度的数据:

  1. 间接归因于 ABAP 应用程序的内存耗费。 这包含 ABAP 程序的动态和动态内存对象中的内存,以及 ABAP 堆栈上程序应用的内存。
  2. 整个外部会话针对主机操作系统的内存调配。 这包含 ABAP 内存耗费以及 ABAP 运行时和外部会话治理耗费的绝对大量的内存。

Memory Inspector 总是在制作内存快照之前运行 ABAP 垃圾收集器,这样 dead 内存对象就不会对内存耗费数据的指标产生影响。

一般来说,特地是因为运行外部会话自身的开销很小,所以咱们个别状况将内存剖析问题的重点,聚焦在 ABAP 应用程序的内存耗费自身。毕竟作为开发人员,咱们在任何状况下都只能影响 ABAP 程序的内存耗费,而不是运行时零碎的内存耗费。

Dynamic and Static Memory Objects

在 ABAP 内存对象的类型中,最容易引起问题的是动态内存对象。所谓动态内存对象,是那些大小能够随着程序运行而扭转的对象。 它们包含以下类型的 ABAP 实体:

  • ABAP 内表(或者更确切地说,内表中的行,即其主体)
  • 字符串
  • 类对象(由 CREATE OBJECT 语句创立的对象)
  • 匿名数据对象(由 CREATE DATA 语句创立的对象)
  • boxed Component

用于拜访动态内存对象的变量蕴含对外部内存构造的援用,其中保留了动态内存对象的数据。 因而,动态内存对象的变量统称为援用变量

在 ABAP 中,将援用的程序实体称为“deep Component”,即必须通过评估援用来拜访其内容的组件。

相比之下,动态内存对象(动态变量,在 Memory Inspector 显示中)是那些其大小在设计时由数据类型申明设置的对象。 除非程序代码自身发生变化,否则程序中此类变量所占用的内存不会发生变化。 动态变量在 ABAP 用语中也称为 flat variableflat Component.