全部博文(389)
分类: Oracle
2011-08-14 11:30:41
ORACLE进程的内存结构解析
每个ORACLE进程从上低地址到高地址,分别由进程序的执行体,PGA SESSION HEAP,,SGA,共享库,空闲空间和STACK区组成.在32位上的LINUX上的,一般都是由08048000处开始加载ORACLE程序的执行体,从0X20000000处开始加载FIXSGA,REDO BUFFER操作系统的特殊区域直到0X20800000,一般大小为8M左右.REDO BUFFER从0X20147000开始加载.那么FIXSGA大小就可以通过0X20147000-0X20000000算出来.共享内存再以粒度的方式被分割.
Variable Size就从20800000处开始载,根据具体的ORACLE配置,可能大小不一样.可以通过ORADEBUG IPC来查看具体的共享内存情况,在OS级别上可以通过PMAP <进程ID>来查看某个进程的内存分布.可以通过SQLPLUS的SHOW SGA或者是查看V$SGA和X$KSMSD来得到各个区域的大小信息.
从10.1g开始引入X$KSMGE,可以反映当前的内存的GRANULE分配情况.通过以下查询SQL> select grantype,granstate,count(gransize)
2 from x$ksmge
3 where granstate<>'INVALID'
4 group by grantype,granstate;
7是BUFFER POOL;1,是SHARD POOL
在某些情况内存可能并没有被用完(PRE_PAGE_SGA),比如我们分本配了32G,实际只使用了20G就可以满足需求了,通过这个查询就可以找出当前合适的内存大小.以防止不必要的浪费.