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,返回内存池大小函数,因为库不同,所以这个函数在内部有很多的宏定义,通过具体使用的库来确 ...
随机推荐
- svn提交代码忘写注释怎么办,我想补充上去?
propset --revprop -r 24288--force "svn:log" "一级采购人在填写申报书,汇总批量删除二级采购人申报书时报错" http ...
- mysql-connector-java升级到6.0以后启动tomcat报错
mysql-connector-java升级到6.0以后启动tomcat报错 java.sql.SQLException: The server time zone value '�й���ʱ��' ...
- 十大开源ERP点评 献给深水区的中小企业和CIO们
原文地址:http://www.oschina.net/news/58437/top-10-erp-software 如今,企业资源规划(ERP)和客户关系管理(CRM)系统的必要性已经被各种组织和企 ...
- 【甘道夫】通过Mahout构建推荐系统--通过IDRescorer扩展评分规则
通过Mahout构建推荐系统时,假设我们须要添�某些过滤规则(比方:item的创建时间在一年以内),则须要用到IDRescorer接口,该接口源代码例如以下: package org.apache.m ...
- 12c weblogic需要输入用户名密码
在目录/home/weblogic_12c/user_projects/domains/base_domain/servers/AdminServer/security下新增文件boot.proper ...
- matlab 投影
function[l]= Gray(I) % I: The name of image A=imread(I);m=0;n=0;[m,n]= size(A);Hproj=zeros(m,1);Vpro ...
- [ GIT ] GIT tip : A simple .gitconfig file
reference : http://fle.github.io/git-tip-a-simple-gitconfig-file.html As several friends have asked ...
- [Linux]在终端启动程序关闭终端不退出的方法
一般情况下关闭终端时,那么在这个终端中启动的后台程序也会终止,要使终端关闭后,后台程序保持执行,使用这个指令: nohup 命令 & 如:nohup test.sh & 回车,然后提示 ...
- Eclipse上传代码到GitHub
平时工作学习中难免会在Github搜索一下开源的Android代码, Android系统本身的代码就是托管在GitHub上,如果平时随手做了一个Demo,托管在云盘感觉不入流,如果平时自己一时兴起写了 ...
- DIV+CSS自适应窗口高度
<html> <head> <title>DIV+CSS自适应窗口高度</title> <style type="text/css&qu ...