分析对象Oracle 10.2.0.4 64bit for linux。先声明一下,分析过程和结论都是个人理解,不一定是正确的。
如果有疑问和建议,欢迎一起讨论学习。
SGA 包含fixed sga 、buffer pool(db cache) 、shared pool 、large pool 、java pool 、streams pool 和redo buffers 。
SGA 中的pool 由多个granule 组成。每个granule 的大小和SGA_MAX_SIZE 的值相关。在Oracle 10.2上,若SGA_MAX_SIZE<=1024MB ,则granule 的值为4MB ;若SGA_MAX_SIZE>1024MB ,则granule 的值为16MB 。
(miki西游 @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1660044 )
SGA 中的fixed sga 和redo buffers 区域是独立分配的,其实它们也存在于某个granule 中。
查询v$sga 视图,显示sga 中的各个部分大小。
SQL> select name,value,to_char(value,'xxxxxxxxxxxxxx') value_hex from v$sga; NAME VALUE VALUE_HEX -------------------- ---------- --------------- Fixed Size 1220432 129f50 Variable Size 335544496 140000b0 Database Buffers 1795162112 6b000000 Redo Buffers 15556608 ed6000
再查询v$sgainfo 中,显示更具体的pool 的大小和granule 的值。
SQL> select name,bytes/1024/1024/16 as "bytes(16M)" FROM v$sgainfo; NAME bytes(16M) -------------------------------- ---------- Fixed SGA Size .072743416 Redo Buffers .927246094 Buffer Cache Size 107 Shared Pool Size 16 Large Pool Size 1 Java Pool Size 2 Streams Pool Size 1 Granule Size 1 Maximum SGA Size 128 Startup overhead in Shared Pool 5 Free SGA Memory Available 0
第一个"granule" 包含Fixed SGA 、Granule directory 、Heap headers 。
最后一个 "granule" 包含Guard pages 、Redo buffer 、Operating system specific overhead 、Remaining space unused 。
(这是juliandyke.com 上的结论,摘录于此,未证实。)
在X$KSMGE 中可以查到sga 的granule 的组成,但结果数比sga_max_size 要少一个granule 。
也可以通过“ALTER SESSION SET EVENTS ‘immediate trace name granulelist level <level>’ ”将granule 的结果dump 出来。
fixed sga area 位于第一个granule 中,它包含的内容如下:
SGA 分成若干个heap ,根据隐含参数”_kghdsidx_count “来判断heap 的个数。
heap 由heap header 和若干extent 组成。
heap extent 由extent header 和若干chunk 组成。
chunk 由chunk header 和chunk body 一一对应。chunk 的类型分为permanent 、recreatable 、freeable 、free 等等。
每个extent 占用一个granule 。但是,dump 出来的结果显示extent 大小不固定,不一定是一个granul 。
每一个heap 的heap header ,包含used chunks 的list 和free chunks 的list 。
free chunks list 是一个hash table ,由255 个bucket 组成。每一个bucket 中存一个double linked list ,指向free chunk 。
隐含参数'_kghdsidx_count' 的值为2 ,SGA_TARGET 也配置了值,所以SGA 中各部分内存是oracle 自动配置的。
SQL> r 1* select name,value from gv_$parameter t where t.name like '_kghdsidx_count' NAME VALUE -------------------- ---------- _kghdsidx_count 2 SQL> show parameter sga NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ lock_sga boolean FALSE pre_page_sga boolean FALSE sga_max_size big integer 2G sga_target big integer 2G
使用dump heapdump 方法将sga 分一下。
ALTER SESSION SET EVENTS 'immediate trace name heapdump level 2';
SGA heap 有两个,但每个heap 又分成4 个部分。
HEAP DUMP heap name="sga heap" desc=0x2000002c HEAP DUMP heap name="sga heap(1,0)" desc=0x2001a960 FIVE LARGEST SUB HEAPS for heap name="sga heap(1,0)" desc=0x2001a960 HEAP DUMP heap name="sga heap(1,1)" desc=0x2001b598 FIVE LARGEST SUB HEAPS for heap name="sga heap(1,1)" desc=0x2001b598 HEAP DUMP heap name="sga heap(1,2)" desc=0x2001c1d0 FIVE LARGEST SUB HEAPS for heap name="sga heap(1,2)" desc=0x2001c1d0 HEAP DUMP heap name="sga heap(1,3)" desc=0x2001ce08 FIVE LARGEST SUB HEAPS for heap name="sga heap(1,3)" desc=0x2001ce08 HEAP DUMP heap name="sga heap(2,0)" desc=0x2001fa50 FIVE LARGEST SUB HEAPS for heap name="sga heap(2,0)" desc=0x2001fa50 HEAP DUMP heap name="sga heap(2,1)" desc=0x20020688 FIVE LARGEST SUB HEAPS for heap name="sga heap(2,1)" desc=0x20020688 HEAP DUMP heap name="sga heap(2,2)" desc=0x200212c0 FIVE LARGEST SUB HEAPS for heap name="sga heap(2,2)" desc=0x200212c0 HEAP DUMP heap name="sga heap(2,3)" desc=0x20021ef8 FIVE LARGEST SUB HEAPS for heap name="sga heap(2,3)" desc=0x20021ef8
参数”_enable_shared_pool_durations” 控制是否启用10g 中特有的shared pool duration 特性,当我们设置sga_target 为0 时该参数为false ;
同时在10.2.0.5 前若cursor_space_for_time 设置为true 时该参数也为false ,不过在10.2.0.5 以后cursor_space_for_time 参数被废弃
总而言之,SGA 的内存物理结构是以granule 为组成单元,以heap 为分区的。SGA 中的buffer cache 、shared pool 、large pool 等都是按照 heap manager 来配置的。