【深入解析--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中分配。

最新文章

  1. CocoaPods pod 安装、更新慢解决方法
  2. zjuoj 3608 Signal Detection
  3. 记 移动端页面中莫名其妙的渲染BUG
  4. HTTP状态码参考
  5. TC SRM 664 div2 A BearCheats 暴力
  6. [置顶] 【Git入门之十五】Github操作指南
  7. IOS中获取各种文件的目录路径的方法-备
  8. 诺基亚HERE地图
  9. Ajax 下拉列表联动显示
  10. ecos的app机制
  11. 构建高并发&高可用&安全的IT系统-高并发部分
  12. Spring任务调度之SpringTask基于XML和基于注解的使用示例
  13. Eclipse报错An internal error occurred during: "J2EE Component Mapping Update". java.lang.NullPointerException
  14. DNS域名解析过程,域名的认识
  15. 微信小程序-用户拒绝授权使用 wx.openSetting({}) 重新调起授权用户信息
  16. fetch使用的常见问题及其解决办法
  17. JavaBasic_07
  18. 【IIS错误】IIS各种错误
  19. ThinkPHP 小于5.0.24 远程代码执行高危漏洞 修复方案
  20. 【Java面试题】60 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法?

热门文章

  1. SQL Server 中添加表注释
  2. 常用NFS mount选项介绍
  3. 【转载】C#堆和栈的区别
  4. [转载] MATLAB快捷键
  5. Spring Boot中使用redis的发布/订阅模式
  6. 怎样用代码方式退出IOS程序
  7. ndk 开发
  8. iOS中alloc与init
  9. cmake函数參数解析
  10. [4] 圆锥(Cone)图形的生成算法