内存结构
3种主要的内存结构
SGA, System Global Area
PGA, Process Global Area
UGA, User Global Area, 存在于SGA(MTS模式)种或者UGA中(专注服务模式)
PGA是一个ORACLE进程专属的内存区域, 它不能被其它的进程访问. PGA绝对不会超过SGA的区域.
UGA事实上就是你的session状态, 你的这个session可以访问的内存区域. UGA的位置取决于你配置的Server怎样接受连接, 如果是MTS模式, 那么UGS必须在一个所有用户都可以访问的内存区域中, 即SGA, 如果是专注服务模式, 那么UGS就基本等于PGA了.
PGA与UGA二者在大小上的差别最大之处应该取决与ini.ora或者是session级别的参数: SORT_AREA_SIZE, 与SORT_AREA_RETAINED_SIZE. 这两个参数控制了ORACLE在将数据写到磁盘之前用来排序数据的内存空间大小, 以及排序完毕以后由多少内存段依然保留. SORT_AREA_SIZE将会将会被分配在PGA里面, 而SORT_AREA_RETAINED_SIZE则在UGA中.
exec dbms_session.free_unused_user_memory;强行释放内存
SGA
每个ORACLE实例都会有一大块的内存, 称为SGA, 这块内存区域所有的ORACLE进程都可以访问. 在UNIX环境下, 可以实实在在的看到这么一大块内存, 但是在WINDOWS环境下, 这块内存是依附于ORACLE.EXE进程下的. 我们可以通过数据字典V$SGASTAT大致查看SGA.
SGA可以分为以下几个区域:
JAVA池: 为数据库的java虚拟机分配
大池: MTS用来管理session内存, 并发时候的消息缓冲, RMAM的磁盘缓冲
共享池: 共享游标, 存储过程, 实体状态, 字典缓存
其它: block buffer, redo log buffer, ‘fixed SGA’
在ini.ora文件中对SGA影响最大的几个参数分别是:
JAVA_POOL_SIZE
SHARED_POOL_SIZE
LARGE_POOL_SIZE
DB_BLOCK_BUFFERS
LOG_BUFFER
除了SHARED_POOL_SIZE, LOG_BUFFER以外, ini,ora中参数值于实际内存中相应SGA区域的大小是一一对应的.
Fixed SGA
Fixed SGA是SGA的一个固件, 并且随着大小随着平台以及版本的不同而不同, 其中存储的是一系列的变量以及指向SGA其它部分的指针. 在Oracle安装的时候这部分就已经固定下来, 我们可以将这一部分看作是SGA的”引导区”.
Redo Buffer
Redo Buffer (Redo Log Buffer, Log Buffer)
那些需要贝写到在线重做日志的数据在写到磁盘之前会临时保存在这个区域中, 数据不会在这里存太久, 在以下情况中, Redo Buffer中的内容会被刷新到在线重做日志中:
1. 每3秒
2. 有人commit
3. 达到1/3满或者缓存了1M以上的重做数据
所以数10M的Redo Buffer通常是浪费内存, 因为根本不会被用到.很少有系统需要用到几M以上的Redo Buffer
Redo Buffer的默认大小(受ini.ora中LOG_BUFFER参数控制), 是512K和(128K * cpu数量)中的较大者, 最小值是当前操作系统支持的最大block大小的4倍.
select * from v$sgastat where name = ‘log_buffer’;
可以看到这个大小, 但是其实际大小:
select * from v$sga where name = ‘Redo Buffers’;
可能会稍微大一点.
因为它需要一些额外的空间来保护其自己.
Block Buffer Cache
这是SGA中一块最大的区域. 这个区域中通常管理着两个列表, “Dirty”(脏数据, 未写到磁盘)以及”No Dirty”(未更改的数据), “No Dirty”的算法比较复杂, 通常是最近用到的以及比较多用到的会比较靠前, 有一个”Touch Count”的概念, 我们可以在一些X$表中看到相关的缓存block信息.
X$BH表中的tch指的就是这个Touch Count.
在Oracle8i以前整个Block Buffer就是一大块, 没法再分开. 但是后来添加了一个”Multiple Buffer Pool”的特性. 利用这个特性, 我们可以开辟出一块指定的空间来缓存我们制定的一些segment, 在这个区间中的block, 指会与制定的那些segment竞争, 而不需要与普通的data block竞争.我们称这一部分空间为Keep Pool. 另外, 我们还可以开辟出一块空间”Recycle pool”, 这块空间中的block管理机制与其它的不同, 其它pool我们都是保存最近使用最多的block, 而在这块空间中, 会尽快的淘汰那些没有使用的block. 这种机制对于那些大但又很少会读到的table很有用处, 因为将它们单独管理, 可以避免它们将那些其它的block buffer中的block冲掉.
[@more@]来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/767125/viewspace-997324/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/767125/viewspace-997324/