【深入解析--eygle】 学习笔记

1.2.2 UGA和CGA

UGA(用户全局区)由用户会话数据、游标状态和索引区组成。在共享server模式下,一个共享服务进程被多个用户进程共享,此时UGA是Shared Pool或Large Pool的一部分。而在专用server模式下,UGA则是PGA的一部分。

不考虑Shared  Server模式,在Dedicated模式下,PGA与UGA关系,就如同Process和Session的关系,PGA是服务于进程的内存结构,包括进程信息;而UGA是服务于会话的,它包括的是会话的信息。UGA中包括例如以下信息:

(1)打开游标的永久区和执行区。

(2)包的状态信息以及变量信息;

(3)Java会话的状态信息;

(4)启用角色信息、跟踪事件;

(5)起作用的NLS參数。

(6)全部打开的database links;

(7)会话訪问控制信息等

UGA也由两组区组成。固定UGA和可变UGA(或者说UGA堆)。固定UGA包括了大概70个原子变量、小的数据结构以及指向UGA堆的指针。

UGA中的内存分配能够通过内部表X$KSMUP(X$KSMUP - [K]ernel [S]ervice[M]emory [U]GA Hea[P])查询得到

UGA堆包括了存储一些固定表(X$表)的永久内存(依赖于特定參数的设置。如OPEN_CURSORS,OPEN_LINKS和MAX_ENABLED_ROLES)。

sys@felix SQL>select ADDR,KSMCHCOM,KSMCHPTR,KSMCHSIZ,KSMCHCLS,KSMCHTYP,KSMCHPAR from x$ksmup;

ADDR             KSMCHCOM                         KSMCHPTR           KSMCHSIZ KSMCHCLS           KSMCHTYP KSMCHPAR

------------------------------------------------ ---------------- ---------- -------------------------- --

00007F528F1D6920dbgdInitEventGr                 00007F528F23FFB0         80freeabl                   0 00

00007F528F1D68C8 sessionlanguag                 00007F528F23FD60        592freeabl                   0 00

00007F528F1D6870 SessionNCHAR l                 00007F528F23FB10        592freeabl                   0 00

00007F528F1D6818 kdlw:UGAstate                  00007F528F23FAC8         72freeabl                   0 00

00007F528F1D67C0 kdlu:UGAstate                   00007F528F23FAA0         40 freeabl                   0 00

00007F528F1D6768kzsrcrdi                        00007F528F23F960        320freeabl                   0 00

00007F528F1D6710kzctxhugi1                      00007F528F23E948       4120 freeabl                   0 00

00007F528F1D66B8 PLS ccahp desc                 00007F528F23E7D0        376freeabl                   0 00

00007F528F1D6660 PLS ccahp desc                 00007F528F23E658        376freeabl                   0 00

00007F528F1D6608 PLS UGAhp                      00007F528F23DE50       2056recr                   409500007F528F23E7E8

00007F528F1D65B0 kgsc htsegs                    00007F528F23DE30         32freeabl                   0 00

00007F528F1D6558 kgsc htsegs                    00007F528F23DE10         32freeabl                   0 00

00007F528F1D6500 kgsc htsegs                    00007F528F23DDF0         32freeabl                   0 00

00007F528F1D64A8 kgsc htsegs                     00007F528F23DDD0         32 freeabl                   0 00

00007F528F1D6450 kgsc htsegs                    00007F528F23DDB0         32freeabl                   0 00

00007F528F1D63F8 kgsc htsegs                    00007F528F23DD90         32freeabl                   0 00

00007F528F1D63A0 kgsc htsegs                    00007F528F23DD70         32freeabl                   0 00

00007F528F1D6348 kgsc htsegs                    00007F528F23DD50         32freeabl                   0 00

00007F528F1D62F0 kgsc htsegs                    00007F528F23DD30         32freeabl                   0 00

00007F528F1D6298 kgsc htsegs                    00007F528F23DD10         32freeabl                   0 00

00007F528F1D6240 kgsc htsegs                     00007F528F23DCF0         32 freeabl                   0 00

00007F528F1D61E8 kgsc htsegs                    00007F528F23DCD0         32freeabl                   0 00

00007F528F1D6190 kgsc htsegs                    00007F528F23DCB0         32freeabl                   0 00

00007F528F1D6138 kgsc htsegs                    00007F528F23DC90         32freeabl                   0 00

00007F528F1D60E0 kgsc htsegs                    00007F528F23DC70         32freeabl                   0 00

从Oracle9iR2開始,有一系列新的隐含參数被引入用于控制自己主动的PGA管理,这当中有一个关键的參数是_use_realfree_heap,当设置这个參数为true时,Oracle会为CGA、UGA单独分配堆。而不从PGA中分配。它的默认值为false,而当设置了pga_aggregate_target后。它的值自己主动被改为true:

SQL>SELECT x.ksppinm NAME, y.ksppstvl VALUE,x.ksppdesc describ

FROMSYS.x$ksppi x, SYS.x$ksppcv y

WHEREx.indx = y.indx AND x.ksppinm LIKE '%&par%';

Enter value for par: realfree

old   3:WHERE x.indx = y.indx AND x.ksppinm LIKE '%&par%'

new   3:WHERE x.indx = y.indx AND x.ksppinm LIKE '%realfree%'

NAME                                     VALUE         DESCRIB

----------------------------------------------------- -----------------------------------------

_realfree_heap_max_size                  32768         minimum max total heap size, in Kbytes

_realfree_heap_pagesize_hint             65536         hint for real-free page size in bytes

_realfree_heap_mode                      0             mode flags for real-free heap

_use_realfree_heap                       TRUE          use real-free based allocator for PGAmemory

SQL>

_use_realfree_heap
是自己主动管理PGA技术的关键技术变化,realfree代表着实时释放。Oracle9i之前手工管理的PGA的主要问题在于。UGA缺省的在PGA中分配,当会话运行了诸如排序、HASH-JOIN等操作。耗用了大量PGA内存,而当会话运行完毕之后。内存会释放给PGA而不是OS。在非常多时候这会导致过度的PGA内存使用(在曾经版本号PGA内存分配和回收是通过malloc()以及brk()调用来完毕的)。从Oracle9iR2開始。自己主动的PGA内存管理当_use_realfree_heap为true时,PGA的内存分配将会通过mmap()调用来实现。这样当调用结束时将不必将内存返回给进程而直接返回给OS。从而实现了更好的PGA内存分配与使用。

通过V$PGASTAT视图能够查询PGA累计释放回OS的内存空间:

SQL> select name,value from v$pgastat wherename like '%OS';

NAME                                          VALUE

---------------------------------------- -----------

PGA memory freed back to OS                175374336

下图是UGA的结构示意图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcGFuZmVsaXg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

在PGA的示意图中,还涉及了另外一块内存区域被称为CGA(Call Global  Area)-调用全局区。与其它的全局区不同。CGA的存在是瞬间的。仅仅存在于调用过程中。并且不管UGA存在于PGA还是SGA,CGA都是PGA的SubHeap


于 实 例 的 一 些 低 层 次 的 调 用(Low-Level Call
)须要CGA,包含分析SQL语句、运行SQL语句以及获取查询结果都须要使用CGA。在SQL运行过程中的每一个递归调用须要一个独立的CGA,在SQL的解析过程中,查询数据字典信息、对SQL进行语法以及语义的解析、SQL的优化以及不同运行计划的评估都须要使用CGA。

当然,调用并非仅仅通过CGA中的数据结构来工作,实际上调用所须要的大部分的关键数据结构都来自于UGA(如SQL AREA, PL/SQL AREA,Sort Area都存放在UGA中,由于这些结构在调用期间须要一直可用)。CGA中仅仅包括了那些调用结束后能够被释放的数据。比如,CGA中包括了Direct
I/O BUFFER、递归调用信息、表达式评估的堆栈信息等。此外Java调用内存也在CGA中分配。

Oracle内存管理(之二)的更多相关文章

  1. Oracle内存管理技术

    1.Oracle内存管理技术 2.配置自动内存管理(AMM) 3.监视自动内存管理(AMM) 4.配置自动共享内存管理(ASMM) 5.配置自动PGA内存管理 Reference 1.Oracle内存 ...

  2. Oracle内存管理理论篇二

    目标 了解oracle内存管理方式 掌握ASMM管理方式 掌握AMM管理方式 监控内存使用 学习一个知识点时,最好先了解其历史.ORACLE近期的版本都对内存管理做了简化,从9i通过PGA_AGGRE ...

  3. Linux内存管理(二)

    Linux内存管理之二:Linux在X86上的虚拟内存管理 本文档来自网络,并稍有改动. 前言 Linux支持很多硬件运行平台,常用的有:Intel X86,Alpha,Sparc等.对于不能够通用的 ...

  4. 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法

    垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己 ...

  5. 这篇关于Oracle内存管理方式的介绍太棒了!我必须要转发,很全面。哈哈~

    "Oracle内存管理可分为两大类,自动内存管理和手动内存管理.其中手动内存管理又可分为自动共享内存管理,手动共享内存管理,自动PGA内存管理以及手动PGA内存管理.本文会简单的介绍不同的内 ...

  6. DPDK内存管理-----(二)rte_mempool内存管理

    DPDK以两种方式对外提供内存管理方法,一个是rte_mempool,主要用于网卡数据包的收发:一个是rte_malloc,主要为应用程序提供内存使用接口.本文讨论rte_mempool.rte_me ...

  7. linux内核--内存管理(二)

    一.进程与内存     所有进程(执行的程序)都必须占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等.不过进程对这些内存的管理方式因内存用途不一而不尽相同,有些内 ...

  8. qemu对虚拟机的内存管理(二)

    上篇文章主要分析了qemu中对虚拟机内存管理的关键数据结构及他们之间的联系,这篇文章则主要分析在地址空间发生变化时,如何将其更新至KVM中,保持用户空间与内核空间的同步. 这一系列操作与之前说的Add ...

  9. Oracle 内存管理

    --内存分配建库时可以先分配系统内存的50%-80%给Oracle,后期根据业务再进行调整.SGA.PGA分配比例:OLTP:SGA %80 , PGA %20OLAP:SGA %50 , PGA % ...

  10. Redis内存管理(二)

    上一遍详细的写明了Redis为内存管理所做的初始化工作,这篇文章写具体的函数实现. 1.zmalloc_size,返回内存池大小函数,因为库不同,所以这个函数在内部有很多的宏定义,通过具体使用的库来确 ...

随机推荐

  1. 普天通信JavaEE开发岗面试题

    1 EJB中有几种Bean,叙述有状态Bean和无状态Bean的差别. 答:EJB中有Session Bean,Entity Bean,以及 Message Driven Bean.这两种的 Sess ...

  2. 为什么说CLR是类型安全的

    CLR总是知道托管堆上的对象是什么类型,这是CLR类型安全的前提.托管堆上的每个对象都有一个"类型对象指针",指向托管堆上Type对象的一个实例.我们总是可以通过System.Ob ...

  3. MVC扩展Filter,通过继承HandleErrorAttribute,使用log4net或ELMAH组件记录服务端500错误、HttpException、Ajax异常等

    □ 接口 public interface IExceptionFilter{    void OnException(ExceptionContext filterContext);} Except ...

  4. DIOCP

    DIOCP GITHUB: https://github.com/ymofen/diocp-v5.git diocp5====== ## 快速开始 从那里得到: git更新(推荐同步更新) 1.htt ...

  5. 编码原则:必须使用的 TODO

    结构 // TODO:JS ParentId 不要使用硬编码. var parentId = record.get('ParentId'); var parentNode = me.getStore( ...

  6. .NET:CLR via C# Thread Basics

    A thread is a Windows concept whose job is to virtualize the CPU. Thread Overhead Thread kernel obje ...

  7. windows下的Nginx+Squid+Tomcat+Memcached集群

  8. nginx: [error] invalid PID number “” in “/usr/local/var/run/nginx/nginx.pid”

    在Mac上用brew安装Nginx,然后修改Nginx配置文件,再重启时报出如下错误: nginx: [error] invalid PID number "" in " ...

  9. 文件操作篇 close creat dup dup2 fcntl flock fsync lseek mkstemp open read sync write

    文件操作篇 close creat dup dup2 fcntl flock fsync lseek mkstemp open read sync write close(关闭文件) 相关函数 ope ...

  10. TCP的TIME_WAIT快速回收与重用

    声明一点: Linux中是无法修改tcp的TIME_WAIT值的,除非重新编译,起码我是没有找到怎么改.值得注意的是,net.ipv4.tcp_fin_timeout这个参数是FIN_WAIT_2的值 ...