`

Oracle内存结构中Process Memory分析

阅读更多

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,他能用来查看每个进程能被分配的堆数据段的最大SIZE及哪一个限制是第一次超过的。

如果这个问题的出现是因为SWAP SPACE空间不足,而且换页的动作非常频繁而且较多,则需要减少系统一级的虚拟内存的使用,这个能通过减少进程数也能通过减少每个进程的内存限制。如果换页动作不频繁而且比较少,则需要调大SWAP SPACE SIZE。

Process Memory Deallocation:

Oracle堆的增长比他们的收缩要来得容易,当然他们的SIZE也是能收缩的。在V$MYSTAT和V$SESSTAT视图中,session的统计信息session uga memory和session pga memory分别显示了当前session的UGA和PGA的内存大小,包含内部的空闲空间。相应的统计信息session uga memory max 和 session pga memory max分别显示了在session的生存期间所使用过得最大的UGA和最大的PGA。

UGA和PGA只有在特定的操作后才会收缩,这些操作如一次磁盘排序的合并操作,或用程式DBMS_SESSION。FREE_UNUSED_USER_MEMORY显示释放内存。只有整个free heap extent会被释放给父堆或是进程堆数据段,所以有一部分的内部free space在内存释放后仍然存在于subheap中。

在大多的操作系统环境下,Oracle是不会减少进程堆数据段也不会释放虚拟内存并将其返还给操作系统的。所以从一个操作系统的查看中,一个Oracle的进程将会把虚拟内存SIZE作为HWM而保留着。如果有必要时,Oracle是会将一些没用的虚拟内存页换页出去的。因为这个原因,有关Oracle进程的虚拟内存页的操作系统统计信息都是非常难理解的。所以一般用的是Oracle内部统计信息来代替使用操作系统的统计信息。

程式DBMS_SESSION。FREE_UNUSED_USER_MEMORY只能在连接是设置为MTS模式的应用才能使用。这个最佳是少点使用,因为他只释放大的包的array变量所占用的内存返还给Large Pool或是Shared Pool。一般地,UGA HEAP的内存应该首先被释放,能通过指派新的空array给array变量使用,也能通过调用程式DBMS_SESSION。RESET_PACKAGE。

 

分享到:
评论

相关推荐

    oracle体系结构8.09

    其中,数据库实例由内存结构(Memory Structures)和后台进程(Background Processes)组成;而数据库文件则包括数据文件(Data Files)、重做日志文件(Redo Log Files)、控制文件(Control File)等。 本文主要...

    oracle体系结构.doc

    Oracle 的内存结构主要分为共享内存区(Shared Memory Area)和非共享内存区。共享内存区中的 System Global Area(SGA)是一个共享的内存区域,所有 Oracle 进程都能访问。SGA 主要包含以下几个部分: 1. 共享池...

    Oracle体系结构.docx

    Instance主要由两部分构成:内存结构(Memory Structure)和后台进程(Background Process)。 内存结构主要包括SGA(System Global Area)和PGA(Program Global Area)。SGA是Instance启动时分配的,每个Instance...

    Oracle体系结构

    ##### 2.1 内存结构(Memory Structures) Oracle实例的内存结构主要由系统全局区(System Global Area, SGA)和程序全局区(Program Global Area, PGA)组成。 - **系统全局区 (SGA)** - **重做日志缓冲区 (Redo...

    Oracle 内存配置

    在Oracle 10g R2版本中,Oracle引入了自动内存管理(Automatic Memory Management, AMM)功能,允许数据库管理员通过设置`SGA_TARGET`或`PGA_AGGREGATE_TARGET`参数来控制共享全局区(SGA)和程序全局区(PGA)的大小。...

    ORACLE数据库培训.docx

    3. 内存结构(Memory) Oracle内存主要分为两大类:系统全局区(System Global Area, SGA)和进程全局区(Program Global Area, PGA)。 - SGA是所有数据库进程共享的内存区域,包含以下关键部分: - 共享池...

    Oracle9i的增强型内存使用率查看表

    Oracle已经通过增强v$process查看表来实现内存监控。v$process查看表里的新数据列允许你显示当前所有Oracle进程的程序全局区(PGA)区域的细节。PGA是内存里的一个专门区域,被单独的进程用来执行内存密集型函数,...

    Oracle体系架构(实例+数据库).pdf

    通过理解实例与数据库的相互作用,内存结构如何支持数据处理,以及后台进程如何保持数据库的稳定运行,我们可以更有效地管理和优化Oracle系统。在实际操作中,利用Oracle提供的系统视图和工具,如V$系列视图,可以...

    oracle全体结构

    Oracle全体结构是数据库管理员和IT专业人员理解Oracle数据库工作原理的关键。这张“一张纸”的概览通常涵盖了Oracle数据库的核心组件、层次以及它们如何协同工作来存储、管理和处理数据。以下是对Oracle全体结构的...

    Oracle Concepts中英文对照版(10g R2).chm

    方案对象 Chapter 6, Dependencies Among Schema Objects 第 6 章,方案对象间的依赖关系 Chapter 7, The Data Dictionary 第 7 章,数据字典 Chapter 8, Memory Architecture 第 8 章,内存体系结构 ...

    Oracle Concepts 中英文对照版 (10g R2).rar

    第 8 章,内存体系结构 Chapter 9, Process Architecture 第 9 章,进程体系结构 Chapter 10, Application Architecture 第 10 章,应用体系结构 Chapter 11, Oracle Utilities 第 11 章,Oracle 工具 ...

    Oracle 10g r2 Concepts 手册(中英文对照阅读版本).chm

    Chapter 8, Memory Architecture 第 8 章,内存体系结构 Chapter 9, Process Architecture 第 9 章,进程体系结构 Chapter 10, Application Architecture 第 10 章,应用体系结构 Chapter 11, Oracle Utilities ...

    C#调用bat和sql文件实现修改oracle数据库的内存大小

    首先,我们要理解Oracle数据库的内存结构。Oracle主要包含两种类型的内存:System Global Area (SGA) 和 Program Global Area (PGA)。SGA是所有数据库进程共享的内存区域,包括数据缓冲区缓存、重做日志缓冲区、共享...

    Oracle Database 10g : 数据库管理 - 课堂练习 II 学生指南第2册

    Oracle 内存结构包括 SGA(System Global Area)和 PGA(Program Global Area) Two Types of Memory Structures。SGA 是一个共享内存区,用于存储数据库的控制信息和用户数据。PGA 是一个私有内存区,用于存储会话...

    Oracle DBA 课件

    Oracle实例是由内存分配和一组后台进程组成的,其中SGA(System Global Area)包含了数据缓冲区、PGA(Program Global Area)和其他共享内存结构。后台进程如DBWR(Database Writer)、LGWR(Log Writer)和PMON...

    Oracle 10g Concepts 中文版

    Chapter 8, Memory Architecture 第 8 章,内存体系结构 Chapter 9, Process Architecture 第 9 章,进程体系结构 Chapter 10, Application Architecture 第 10 章,应用体系结构 Chapter 11, Oracle Utilities ...

    Oracle数据库管理维护培训

    - **Oracle结构组件**:Oracle数据库的核心组成部分包括数据库本身、实例以及相关的内存结构。其中,系统全局区(SGA)和程序全局区(PGA)是核心的内存结构。 - **系统全局区(SGA)**:它是所有用户进程和服务器进程...

    Oracle Concepts 中文英文对照版 (10g R2)

    方案对象 Chapter 6, Dependencies Among Schema Objects 第 6 章,方案对象间的依赖关系 Chapter 7, The Data Dictionary 第 7 章,数据字典 Chapter 8, Memory Architecture 第 8 章,内存体系结构 ...

Global site tag (gtag.js) - Google Analytics