Oracle内存管理(之二)
【深入解析--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内存管理(之二)的更多相关文章
- Oracle内存管理技术
1.Oracle内存管理技术 2.配置自动内存管理(AMM) 3.监视自动内存管理(AMM) 4.配置自动共享内存管理(ASMM) 5.配置自动PGA内存管理 Reference 1.Oracle内存 ...
- Oracle内存管理理论篇二
目标 了解oracle内存管理方式 掌握ASMM管理方式 掌握AMM管理方式 监控内存使用 学习一个知识点时,最好先了解其历史.ORACLE近期的版本都对内存管理做了简化,从9i通过PGA_AGGRE ...
- Linux内存管理(二)
Linux内存管理之二:Linux在X86上的虚拟内存管理 本文档来自网络,并稍有改动. 前言 Linux支持很多硬件运行平台,常用的有:Intel X86,Alpha,Sparc等.对于不能够通用的 ...
- 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法
垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己 ...
- 这篇关于Oracle内存管理方式的介绍太棒了!我必须要转发,很全面。哈哈~
"Oracle内存管理可分为两大类,自动内存管理和手动内存管理.其中手动内存管理又可分为自动共享内存管理,手动共享内存管理,自动PGA内存管理以及手动PGA内存管理.本文会简单的介绍不同的内 ...
- DPDK内存管理-----(二)rte_mempool内存管理
DPDK以两种方式对外提供内存管理方法,一个是rte_mempool,主要用于网卡数据包的收发:一个是rte_malloc,主要为应用程序提供内存使用接口.本文讨论rte_mempool.rte_me ...
- linux内核--内存管理(二)
一.进程与内存 所有进程(执行的程序)都必须占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等.不过进程对这些内存的管理方式因内存用途不一而不尽相同,有些内 ...
- qemu对虚拟机的内存管理(二)
上篇文章主要分析了qemu中对虚拟机内存管理的关键数据结构及他们之间的联系,这篇文章则主要分析在地址空间发生变化时,如何将其更新至KVM中,保持用户空间与内核空间的同步. 这一系列操作与之前说的Add ...
- Oracle 内存管理
--内存分配建库时可以先分配系统内存的50%-80%给Oracle,后期根据业务再进行调整.SGA.PGA分配比例:OLTP:SGA %80 , PGA %20OLAP:SGA %50 , PGA % ...
- Redis内存管理(二)
上一遍详细的写明了Redis为内存管理所做的初始化工作,这篇文章写具体的函数实现. 1.zmalloc_size,返回内存池大小函数,因为库不同,所以这个函数在内部有很多的宏定义,通过具体使用的库来确 ...
随机推荐
- erlang 中文社区 下载
http://www.cnerlang.com/download/ erlang 下载 http://www.blogjava.net/killme2008/archive/2007/06/1 ...
- 用Qemu模拟vexpress-a9 (六) --- 多核
环境介绍 Win7 64 + Vmware 11 + ubuntu14.04 32 u-boot 版本:u-boot-2015-04 Linux kernel版本:linux-3.16.y busyb ...
- datagrid在MVC中的运用04-同时添加搜索和操作区域
本文介绍在datagrid上同时添加搜索和操作区域. 仅仅是增加操作区域 □ 方法1 $('#dg').datagrid({ toolbar: '#tb' }); <div id="t ...
- Android之计算两个时间的相差
参数: sdate = 2013-07-16 16:14:47 /** * 以友好的方式显示时间 * @param sdate * @return */ public static String ...
- [实时更新]jquery全部版本号下载
jquery-2.1.0 注!不再支持IE 6/7/8 直接引用地址: 开发版地址1: <script src="http://code.jquery.com/jquery-2. ...
- 使用StringBuilder或StringBuffer简单优化
使用StringBuilder或StringBuffer // join(["a", "b", "c"]) -> "a an ...
- python的内存回收机制即gc模块讲解
最后容易造成内存问题的通常就是全局单例.全局缓存.长期存活的对象 引用计数(主要), 标记清除, 分代收集(辅助) 引用计数为0则会被gc回收.标记删除可以解决循环引用的问题.分代:0代--年轻代:1 ...
- zoj 2860 四边形优化dp
Breaking Strings Time Limit: 2 Seconds Memory Limit: 65536 KB A certain string-processing lan ...
- dp 密度 分辨率 屏幕 状态栏 标题栏 适配
一篇总结的非常完善的博文:http://www.jianshu.com/p/ec5a1a30694b 屏幕像素参数相关信息表格 屏幕级别 像素密度 每英寸像素数 通常分辨率 分辨率别称 默认 ...
- 超级简单的jquery操作表格(添加/删除行、添加/删除列)
利用jquery给指定的table添加一行.删除一行 <script language="javascript" src="./jquery.js"> ...