日期:2013-05-29  浏览次数:20440 次


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)

 

The CGA:

  跟其它的全局区不同,Call Global Area是短暂性存在的.它只要在调用数据期间存在,普通是在对实例的最低级别的调用时才需求CGA,如下:

       分析一个SQL语句

       执行一个SQL语句

       取出一个SELECT语句的输出

  一个单独的CGA在递归调用时是需求的.在SQL语句的分析过程中,对数据字典信息的递归调用是需求的,由于要对SQL语句进行语法分析,还有在语句的优化期间要计算执行计划.执行PL/SQL块时在处理SQL语句的执行时也是需求递归调用的,在DML语句的执行时要处理触发器执行也是需求递归调用的.

  不管UGA是放在PGA中还是在SGA中,CGA都是PGA的一个子堆(Subheap).这个理想的一个重要推论是在一个调用的期间会话必须是一个进程.对于在一个MTS的Oracle数据库进程使用开发时关于这一点的理解是很重要的.如果相应的调用较多,就得添加processes的数量以顺应调用的添加.

  没有CGA中的数据结构,CALLS是没法任务的.而实际上跟一次CALL相关的数据结构普通都是放在UGA中,如SQL AREA,PL/SQL AREA和SORT AREA它们都必须在UGA中,由于它们要在各CALLS之间要不断存在并且可用.而CGA中所包含的数据结构是要在一次CALL结束后能够释放的.例如CGA包含了关于递归调用的信息,直接I/O BUFFER等还有其它的一些临时性的数据结构.

  Java Call Memory也是在CGA中.这一段内存比Oracle的其它内存段管理得更密集.它分成三个Space: Stack Space, New Space, Old Space.在New Space和Old Space中不再被参考使用的Chunks,依据它们在使用期间的长度及SIZE的不同,在调用的执行过程中将被当成不用的Chunks收集起来.New Space Chunks很多次的不用的Chunks的反复收集过程中没有被收集的Chunks将会被放到Old Space Chunks中.这是在Oracle内存管理中独一的一个废物收集(garbage collection),其它的Oracle内存段都是释放Dead Chunks.

 

Process Memory Allocation

  跟SGA不一样的是,SGA在实例启动之后SIZE就曾经是定下来的,而PGA的SIZE是会增长的.通过使用malloc()或者sbrk()系统调用来为进程添加堆数据段大小而使得PGA的SIZE的增长.OS的新虚拟内存会被做为PGA HEAP中的一个新的区被加到PGA中来.这些区普通只几KB大,如果有需求,Oracle将会给分配上千个区.

  操作系统对每个进程的堆数据段的增长是无限制的.大部分的情况是操作系统的内存参数进行限制(kernel parameter: MAXDSIZ),有一些情况它的缺省值是可以以每个进程为基准进行修正的.对于所有的进程,操作系统对整个虚拟内存也有一个系统全局性的限制,这个限制跟系统的SWAP SPACE相关.一旦超过了这两个限制,Oracle的进程在执行中会遇到ORA-4030错误.

  ORA-4030这个错误的产生普通不是由于每个进程的资源限制而是由于SWAP SPACE空间不足形成.为了诊断这个问题可以使用操作系统的一些选项来查看SWAP SPACE的使用情况.另外,在一些操作系统中,Oracle包含了一个工具叫maxmem,它可以用来查看每