内存分配和释放在各个时间进行。可以在发生特定事件(例如应用程序建立连接)时将内存分配给特定内存区,也可以为了响应配置更改而重新分配内存。
图 1 显示了数据库管理器为不同用途分配的各个内存区以及允许您控制这些内存区的大小的配置参数。请注意,在分区数据库环境中,每个数据库分区都将设置自己的数据库管理器共享内存。
每当发生下列其中一个事件时,数据库管理器都将分配内存:
- 数据库管理器启动时(db2start)
- 数据库管理器共享内存(也称为实例共享内存)在数据库管理器停止(db2stop)前将保持处于已分配状态。此区域包含数据库管理器在管理通过所有数据库连接进行的活动时所需的信息。DB2®
将自动控制数据库管理器共享内存的大小。
- 第一次激活数据库或者连接到数据库时
- 所有与数据库连接的应用程序均使用数据库全局内存。数据库全局内存的大小由
database_memory 数据库配置参数指定。缺省情况下,此参数设置为 automatic,从而允许
DB2 计算为数据库分配的初始内存量以及在运行时根据数据库的需要自动配置数据库内存大小。
可以对下列内存区进行动态调整:
- 缓冲池(使用 ALTER BUFFERPOOL 语句)
- 数据库堆(包括日志缓冲区)
- 实用程序堆
- 程序包高速缓存
- 目录高速缓存
- 锁定列表
此外,还可以动态地更新
sortheap、
sheapthres_shr
和
sheapthres 配置参数。唯一的限制是,不能动态地将
sheapthres
由 0 更改为大于 0 的值,反之亦然。
缺省情况下,将执行共享排序操作,排序内存使用者在任何一个时间可以使用的数据库共享内存量由
sheapthres_shr 数据库配置参数值确定。仅当分区内并行性、数据库分区和连接集中器都处于禁用状态,并且
sheapthres 数据库管理器配置参数设为非零值时,才能执行专用排序操作。
- 应用程序连接至数据库时
- 每个应用程序都有自己的应用程序堆,这是应用程序全局内存的组成部分。您可以使用
applheapsz 数据库配置参数来限制任何一个应用程序可以分配的内存量,也可以使用
appl_memory 数据库配置参数来限制应用程序内存总耗用量。
- 创建代理程序时
- 当分区数据库环境中出现连接请求或新的 SQL 请求时,系统将指定代理程序并为其分配代理程序专用内存。代理程序专用内存包含仅供此特定代理程序使用的内存。如果已启用专用排序操作,那么将从代理程序专用内存中分配专用排序堆。
下列配置参数用于限制为每种类型的内存区分配的内存量。请注意,在分区数据库环境中,将在每个数据库分区中分配此类内存。
- numdb
- 此数据库管理器配置参数指定各个应用程序可以使用的并行活动数据库的最大数目。因为每个数据库都有自己的全局内存区,所以增大此参数的值将增加可以分配的内存量。
- maxappls
- 此数据库配置参数指定可以同时连接到特定数据库的应用程序的最大数目。
此参数的值将影响可以为该数据库分配的代理程序专用内存量和应用程序全局内存量。
- max_connections
- 此数据库管理器配置参数用于限制任何时候可以访问数据服务器的数据库连接或实例连接的数目。
- max_coordagents
- 此数据库管理器配置参数用于限制,一个实例的所有活动数据库中可以同时存在的数据库管理器协调代理程序的数目(在分区数据库环境中,将对每个数据库分区实施此限制)。与
maxappls 和 max_connections
相配合,此参数将限制为代理程序专用内存和应用程序全局内存分配的内存量。
db2mtrk 命令所调用的内存跟踪程序使您能够查看实例中的当前内存分配量。您还可以使用
ADMIN_GET_DBP_MEM_USAGE 表函数来确定整个实例或单一数据库分区的内存消耗总量。GET SNAPSHOT
命令使您能够在实例、数据库或应用程序级别检查当前内存使用情况。
在 Unix 和 Linux 上,尽管 ipcs 命令可用于列出所有共享内存段,但是该命令不会精确地反映已消耗的资源量。可使用 db2mtrk 命令替代 ipcs。