设为首页 收藏本站
查看: 447|回复: 0

[经验分享] Oracle内存管理(之二)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-7-28 09:07:25 | 显示全部楼层 |阅读模式
【深入解析--eygle】 学习笔记

1.2.2 UGA和CGA
UGA(用户全局区)由用户会话数据、游标状态和索引区组成。在共享服务器模式下,一个共享服务进程被多个用户进程共享,此时UGA是Shared Pool或Large Pool的一部分,而在专用服务器模式下,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的结构示意图:
SouthEast.jpg

在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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-22740-1-1.html 上篇帖子: oracle的内存管理(之一) 下篇帖子: Oracle内存结构(之三) Oracle
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表