在 Oracle 12C 版本之前,我们通常是通过设置参数 PGA_AGGREGATE_TARGET 来确定一个 PGA 的使用量。但是,PGA_AGGREGATE_TARGET 不会限制 PGA 内存使用量,它只是一个目标,用于动态调整进程工作区的大小。它不会影响允许超出此限制的其他 PGA 区域,也就是说这不是硬限制,有时候会超出上限,导致 PGA 内存使用无法准确掌控。
所以从 Oracle 12C 开始引入了一个参数 PGA_AGGREGATE_LIMIT,允许数据库管理员设置 PGA(Program Global Area)内存的使用上限。通过配置该参数,可以对 PGA 的使用量进行硬性限制。如果 PGA 使用超出设置的值,Oracle 数据库会中止或终止占用最多、不可调整 PGA 内存的会话或进程。
在 Oracle 18C 及更高版本中,MGA(Managed Global Area) 被包含在 PGA 中。这意味着在这些版本中,PGA 的大小需要适当增加,以容纳 MGA。PGA 内存分配要求 PGA_AGGREGATE_LIMIT 足够大,才能满足 MGA 和其他 PGA 的需求。
📢注意:连接的进程在其生命周期内不会将分配的内存释放回操作系统,除非进程断开连接。
这是预期行为,因为 PGA 在进程整个生命周期内保持分配状态,并根据运行时需求动态增长。如果操作系统需要,可能会为实例分配额外内存以处理大型排序等操作。然而,PGA 的内存一旦分配并释放用于实例操作(例如完成大型排序后),这部分内存将保留在进程中以供将来使用,而不会缩减或归还给操作系统。