The Process Memory:
除了 SGA(System Global Area) 之外 ,Oracle 进程还使用下面三个全局区 :
The Process Global Area (PGA)
The User Global Area (UGA)
The Call Global Area (CGA)
很多人都搞不清楚 PGA 和 UGA 两者之间的区别 , 实际上两者之间的区别跟一个进程和一个会话之间的区别是类似的 . 尽管说进程和会话之间一般都是一对一的关系 , 但实际上比这个更复杂 . 一个很明显的情况是 MTS 配置 , 会话往往会比进程多得多 . 在这种配置下 , 每一个进程会有一个 PGA, 每一个会话会有一个 UGA.PGA 所包含的信息跟会话是无任何关联的 , 而 UGA 包含的信息是以特定的会话为基础的 .
The PGA:
进程全局区 (PGA) 即可以理解为 Process Global Area, 也可以理解为 Program Global Area. 它的内存段是在进程私有区 (Process Private Memory) 而不是在共享区 (Shared Memory). 它是个全局区意味着它包含了所有代码有可能进入的全局变量和数据结构 , 但是它是不被所有进程共享的 . 每个 Oracle 的服务器进程都包含有属于自己的 PGA, 它只包含了本进程的相关特定信息 .PGA 中的结构不需要由 latches 来保护 , 因为其它的进程是不能进入到这里面来访问的 .
PGA 包含的是有关进程正在使用的操作系统资源信息以及进程的状态信息 , 而其它的进程所使用的 Oracle 的共享资源是在 SGA 中 .PGA 是私有的而不是共享的 , 这个机制是有必要的 , 因为当进程死掉后可以把这些资源清除和释放掉 .
PGA 包含两个主要区域 :Fixed PGA 和 Variable PGA 或称为 PGA Heap. Fixed PGA 的作用跟 Fixed SGA 是类似的 , 都包含原子变量 ( 不可分的 ), 小的数据结构和指向 Variable PGA 的指针 .
Variable PGA 是一个堆 . 它的 Chunks 可以从 Fixed Table X$KSMPP 查看得到 , 这个表的结构跟前面有提到的 X$KSMSP 是相同的 .PGA HEAP 包含了一些有关 Fixed Table 的永久性内存 , 它跟某些参数的设置有依赖关系 . 这些参数包含 DB_FILES,LOG_FILES,CONTROL_FILES.
The UGA:
UGA(User Global Area) 包含的是特定会话的信息 , 有如下一些 :
所打开游标的持续和运行时间内的区域
包的状态信息 , 特定的变量
Java 会话状态
可以用的 ROLES
被 ENABLE 的跟踪事件
起作用的 NLS 参数设置
打开的 DBLINK
会话的入口控制
跟 PGA 一样 ,UGA 也由两区组成 :Fixed UGA 和 Variable UGA, 也称为 UGA HEAP. Fixed UGA 包含了大约 70 个原子变量 , 小的数据结构和指向 Variable UGA 的指针 .
UGA HEAP 中的 Chunks 可以从它们自己的会话中通过查看表 X$KSMUP 获得相关信息 , 这个表的结构跟 X$KSMSP 是一样的 .UGA HEAP 包含了一些有关 fixed tables 的永久性内存段 , 跟一些参数的设置有依赖关系 . 这些参数有 OPEN_CURSORS,OPEN_LINKS, 和 MAX_ENABLE_ROLES.
UGA 在内存中的位置依赖于会话的配置方式 . 如果会话连接的配置方式是专用服务器模式 (DDS) 即是一个会话对应一个进程 , 则 UGA 是放在 PGA 中的 . 在 PGA 中 ,Fixed UGA 是其中的一个 Chunk, 而 UGA HEAP 是 PGA 的一个子堆 (Subheap). 如果会话连接是配置为共享服务器模式 (MTS), Fixed UGA 是 SHARED POOL 中的一个 Chunk, 而 UGA HEAP 则是 SHARED POOL 中的子堆 (Subheap)