第十七章 进程内存
第十七章 进程内存
介绍
进程使用许多不同的资源来实现其目标。其中包括部分或全部 CPU 周期、内存、外部存储、网络带宽等。这篇文章是关于内存使用的。具体来说,它处理为数据存储分配的内存,例如:
- 公共和私有变量
当第一次为它们分配值时,它们被分配了内存空间。在局部数组的情况下,局部变量名称加上所有下标的值的组合引用单个变量值。
除了包含极长字符串的变量外,变量会占用与 $STORAGE
相关的空间。包含极长字符串的变量以不同方式存储,并且不占用 $STORAGE
中的空间。
- 对象实例
每当实例化一个对象时,都会分配空间来保存对象的当前内容以及它所引用的对象。删除最后一个对象引用时返回该空间。
- 本地
I/O
缓冲区
将与该进程正在使用的设备相关联的 I/O
缓冲区存储在进程空间中。
管理进程空间
进程从用于上述实体的初始内存池开始。当应用程序创建它们时,它们会消耗池中的内存;当应用程序删除它们时,它们的内存将返回到池中。例如,当一个例程开始执行时,总是会创建消耗一些内存的局部变量;当例程返回并且这些变量超出范围时,这些变量使用的内存将被返回并可供重用。
当应用程序需要内存,并且进程在其内存池中没有足够大(连续)的可用内存区域来满足需求时,该进程会从底层操作系统请求额外的内存块以添加到其池中。稍后,如果该内存块完全未使用,它将返回给操作系统。由于为实体分配内存的顺序和从内存中删除这些实体的顺序不一定是彼此的镜像,因此随着执行的进行,内存在某种程度上会变得碎片化。这会影响上述操作系统的内存分配和释放。
$ZSTORAGE
进程最多可使用 2TB
内存。为了帮助管理内存使用, 为管理员或应用程序提供了一种方法来设置较小的内存消耗限制。该值存储在每个进程的系统变量 $ZSTORAGE
中,因此 $ZSTORAGE
始终包含进程内存的最大允许大小(以 KB
为单位)。
$ZSTORAGE
的值以 1KB
为单位指定。允许的最小值为 256
,即 256KB
。进程可以为 $ZSTORAGE
设置的最大值是 2TB (231 * 1KB)
内存。尝试设置小于最小值或大于最大值的值将分别默认为最小值或最大值。
每个进程内存最大值
此值通过管理门户设置。要访问相关页面,请选择系统管理 > 配置 >系统配置 > 内存和启动。在出现的页面上,设置Maximum Per-Process Memory (KB)
中的值。
在配置文件 (iris.cpf
) 中,此参数称为 bbsiz
。此值是进程启动时 $ZSTORAGE
的初始值。
注意:也可以在通过 ObjectScript JOB
命令启动进程时设置进程的内存限制。
$STORAGE
系统变量 $STORAGE
表示仍在运行的进程可用的存储量。它以字节为单位。当进程对内存的请求大于 $STORAGE
中的值或从操作系统分配内存的请求失败时,它会生成 <STORE>
错误。
<STORE> 错误
当满足进程的内存请求会导致 $STORAGE
的值变为负数,或者操作系统分配内存的请求失败时,它会生成 <STORE>
错误。关于处理 $STORAGE
变为负数的 <STORE>
错误, 进程可以被认为处于以下两种模式之一:正常模式和低内存模式。
- 正常模式
当进程处于正常模式并请求内存,否则会导致 $STORAGE
变为负数时,该进程会抛出 <STORE>
错误并进入低内存模式。
- 低内存模式
在低内存模式下,允许操作将 $STORAGE
推为负数,以便为应用程序提供一些额外的内存来处理错误和清理。当处于低内存模式的进程释放内存时,$STORAGE
的值至少上升到 256KB
(或 $ZSTORAGE
的 25%
,如果它更低),该进程将返回正常模式。在低内存模式下,$STORAGE
的下限约为 -1MB
。否则会导致 $STORAGE
低于该限制的任何操作都会导致 <STORE>
错误。下限的值由进入低内存模式时的 $STORAGE
值定义,减去 1MB
。
注意:进程可以将 $ZSTORAGE
设置为其允许范围内的任何值。如果 $ZSTORAGE
设置为小于当前使用的值,则 $STORAGE
将具有负值。如果在进程处于正常模式时发生这种情况,分配内存的下一个操作将导致进程获得 <STORE>
错误并进入低内存模式,下限等于该值减去 1MB
。如果在进程已经处于低内存模式时发生这种情况,则下限保持不变。
对于因超出 -1MB
低内存模式限制或未能从操作系统分配内存而导致的 <STORE>
错误,由于可用内存太少,进程的行为是不可预测的。进<STORE>
错误,或者错误处理程序可能无法被调用并且进程可能会停止。
错误处理程序可以使用以下一种或多种方法解决 <STORE>
错误:
- 中止导致内存请求的计算,可能会释放计算在发生
<STORE>
错误之前获得的任何存储空间。 - 尝试通过删除不需要的数据来生成更多可用内存。
- 执行任何必要的清理工作(例如关闭打开的文件),然后终止程序。
- 将
$ZSTORAGE
的值设置为更大的值,以允许进程继续并在将来请求更多内存。
特别注意事项
平台
大多数实例在每个进程的可分配空间少于 2TB
的系统上运行。在此类系统上,当 进程耗尽可用系统内存(实际物理内存加上可用交换空间)时,底层系统可能会以多种方式处理这种情况。一些例子是:
- 在某些平台上,系统会发送一个信号,导 进程终止。
- 在某些平台(例如 Linux 和 AIX)上,系统使用启发式算法来杀死它认为最具攻击性的进程。这可能是流程,但也可能是另一个选择的流程。
- 一些系统通过产生使底层操作系统崩溃的内核“恐慌
panic
”来处理内存耗尽。 - 一些系统可以处理内存耗尽的情况,但恢复可能会导致进程中的访问冲突。
良好的编程实践表明进程不应依赖于底层平台使用的错误恢复算法。相反,此类流程应提供充分的设计、测试和日志记录,以允许流程适当地估计和管理其自身的资源需求。