ABAP Memory Inspector 里对动态内存对象的内存消耗度量方式

简介: ABAP Memory Inspector 里对动态内存对象的内存消耗度量方式

ABAP 静态内存对象是其大小在设计时由数据类型声明设置的对象。 除非更改程序代码本身,否则程序中此类变量占用的内存不会更改。


在 ABAP 术语中,静态变量也称为 flat variableflat Component.


下面是这种类型的变量在 ABAP Memory Inspector 里显示的例子:

2ac3fbdd4cdbcfc4dc0c13b7bf1a86ca.png

值语义(Value semantics)和引用语义(reference semantics)描述了动态内存对象在多个变量引用它时的两种行为方式。


用于特定类型的动态内存对象的语义对该类型的对象使用内存的方式产生重要影响。


本质上,使用值语义的引用变量总是有它自己的、唯一的它所引用的内存对象的副本。值语义变量类似于静态变量; 像静态变量一样,它直接绑定到它所代表的内存对象。尽管变量只是一个引用,但从语义上讲,它是内存对象本身。


相比之下,使用引用语义的引用变量被理解为指向内存对象的指针。 内存对象在语义上独立于引用变量。对象可以在许多这样的变量之间共享。


使用值语义解析对 ABAP 内部表、字符串或 boxed Component 的多个引用。


  • 内部表、字符串或 boxed Component 的每个变量都指向它自己的内存对象的单独副本。


  • 将表、字符串或 boxed Component 分配给第二个 ABAP 变量会触发对象的复制操作,以便每个变量都有自己的对象副本。


  • 通过特定变量对内部表、字符串或 boxed Component 所做的更改,对于已分配给同一对象的其他变量是不可见的。


看个具体的例子:

DATA t1 TYPE STANDARD TABLE OF xyz.
DATA t2 TYPE STANDARD TABLE OF xyz.
DATA t_wa type xyz.
...
t2[] = t1[].


从语义上讲,T1 和 T2 各自有自己的内表私有副本。 由于 ABAP 的惰性复制(lazy copy)策略,T1 和 T2 当前都指向内存中的单个内部表。 如果表有 1000 行,长度为 20 字节,那么现在拍摄的 memory snapshot 将显示 20 KB 的动态对象内存,即一个表的大小。


如果现在将 T_WA 工作区附加到其中一个表,下一个快照将显示动态对象的内存将增加一倍以上。

APPEND t_wa TO t1.

原因:对 T1 的更改意味着 ABAP 最终必须完成为 T2 创建表副本。


现在 t1 和 t2 都有自己的私有动态内存对象。


T1 的表也比 T2 的表多一行。


当 APPEND 发生时,ABAP 看到表的引用计数器的值为 2,需要复制动态内存对象(表体)。


在 APPEND 之后,表的每个副本的引用计数器值为 1。

98d1b82447f705dcc5eb9c7e36e52525.png

相关文章
|
7天前
|
存储 网络协议 大数据
一文读懂RDMA: Remote Direct Memory Access(远程直接内存访问)
该文档详细介绍了RDMA(远程直接内存访问)技术的基本原理、主要特点及其编程接口。RDMA通过硬件直接在应用程序间搬移数据,绕过操作系统协议栈,显著提升网络通信效率,尤其适用于高性能计算和大数据处理等场景。文档还提供了RDMA编程接口的概述及示例代码,帮助开发者更好地理解和应用这一技术。
|
1月前
|
存储 Java 程序员
Java中对象几种类型的内存分配(JVM对象储存机制)
Java中对象几种类型的内存分配(JVM对象储存机制)
60 5
Java中对象几种类型的内存分配(JVM对象储存机制)
|
17天前
|
存储 程序员 Python
Python类的定义_类和对象的关系_对象的内存模型
通过类的定义来创建对象,我们可以应用面向对象编程(OOP)的原则,例如封装、继承和多态,这些原则帮助程序员构建可复用的代码和模块化的系统。Python语言支持这样的OOP特性,使其成为强大而灵活的编程语言,适用于各种软件开发项目。
15 1
|
1月前
|
设计模式 uml
在电脑主机(MainFrame)中只需要按下主机的开机按钮(on()),即可调用其它硬件设备和软件的启动方法,如内存(Memory)的自检(check())、CPU的运行(run())、硬盘(Hard
该博客文章通过一个电脑主机启动的示例代码,展示了外观模式(Facade Pattern)的设计模式,其中主机(MainFrame)类通过调用内部硬件组件(如内存、CPU、硬盘)和操作系统的启动方法来实现开机流程,同时讨论了外观模式的优缺点。
|
1月前
|
存储 缓存 监控
托管内存(Managed Memory)
托管内存(Managed Memory)
|
2月前
|
存储 缓存 算法
(五)JVM成神路之对象内存布局、分配过程、从生至死历程、强弱软虚引用全面剖析
在上篇文章中曾详细谈到了JVM的内存区域,其中也曾提及了:Java程序运行过程中,绝大部分创建的对象都会被分配在堆空间内。而本篇文章则会站在对象实例的角度,阐述一个Java对象从生到死的历程、Java对象在内存中的布局以及对象引用类型。
|
2月前
|
监控 安全 Java
JVM内存问题之排查Direct Memory泄漏有哪些常用方法
JVM内存问题之排查Direct Memory泄漏有哪些常用方法
|
2月前
|
Arthas 监控 Java
JVM内存问题之使用gperftools分析JNI Memory泄漏的具体步骤是什么
JVM内存问题之使用gperftools分析JNI Memory泄漏的具体步骤是什么
|
2月前
|
NoSQL Redis C++
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
|
2月前
|
Java 运维
开发与运维内存问题之在堆内存中新创建的对象通常首先分配如何解决
开发与运维内存问题之在堆内存中新创建的对象通常首先分配如何解决
17 1