结论
1,与共享池相关的参数为:shared_pool_size,shared_pool_reserved_size,_shared_pool_reserved_pct
_shared_pool_reserved_min_alloc
2,shared_pool_reserved_size一般默认是shared_pool_size的5%,这个比例由参数_shared_pool_reserved_pct控制
3,_shared_pool_reserved_min_alloc控制保留池中最小的分配大小,默认大小为4400,其取值范围为4000bytes到60M之间(当然这是基于当前共享池大小)
否则会报错数据库无法重启
4,调整 shared_pool_reserved_size,_shared_pool_reserved_pct,_shared_pool_reserved_min_alloc全要重启库方可
5,调整上述的参数可以是相互独立,即调整一个参数后,其它参数不会动态进行相应的调整,仍保持原值
6,每个保留列表对应堆HEAP,即多少个堆就有多少个保留列表
每个保留列表下面包括14个BUCKET
7,调整上述几个参数,发现保留列表相关数据没有发生明显的变化,当然,也限于我对这块的理解还不到位
8,x$ksmspr记录保留区CHUNK的分配情况,CHUNK大小共计2种,第1种为48字节,第2种为
4529992即4424K,具体测试见
经过在UE进行查找分析比对 (在文章进行匹配查找即可) 9,关于x$ksmspr的使用,请见下面测试之 --获知与CHUNK分配相关的X视图(在文章进行匹配查找即可)
10,
x$ksmsp是x$ksmspr的父集,即前者包含后者 测试
----oracle version
SQL> select * from v$version where rownum=1;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
--与保留区相关的参数,可见shared_pool_reserved_size=shared_pool_size*_shared_pool_reserved_pct,且_shared_pool_reserved_pct默认值为5%
SQL> show parameter shared_pool
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
shared_pool_reserved_size big integer 44M
shared_pool_size big integer 0
控制从共享池分配多大比例给保留池,可见为5%
_shared_pool_reserved_pct 5 percentage memory of the shared pool allocated for
the reserved area
保留池中最小的分配大小为4400字节,也就是小于这个大小,不会从保留池分配内存,只会从FREE LIST及LRU LIST分配内存
_shared_pool_reserved_min_alloc 4400 minimum allocation size in bytes for reserved area
of shared pool
v$sgainfo或者__shared_pool_size可得到当前共享池的大小
SQL> select name,bytes/1024/1024 as mb,resizeable from v$sgainfo where name='Shared Pool Size';
NAME MB RES
-------------------------------- ---------- ---
Shared Pool Size 832 Yes
__shared_pool_size 872415232 Actual size in bytes of shared pool
SQL> select 872415232*0.05/1024/1024 mb from dual;
MB
----------
41.6
先研究下参数shared_pool_reserved_size调整对于共享池内存分配的影响
----未调整shared_pool_reserved_size前
----共计4个heap
SQL> host more /home/ora10g/admin/ora10g/udump/ora10g_ora_14042.trc|grep -i --color sga
HEAP DUMP heap name="sga heap" desc=0x60000058
HEAP DUMP heap name="sga heap(1,0)" desc=0x60034fe0
HEAP DUMP heap name="sga heap(1,1)" desc=0x60036838
Chunk 0a3b7bc20 sz= 4190296 recreate "KSFD SGA I/O b " latch=(nil)
HEAP DUMP heap name="sga heap(1,2)" desc=0x60038090
HEAP DUMP heap name="sga heap(1,3)" desc=0x600398e8
---可见每个heap对应一个保留区的free list,共计4个
SQL> host more /home/ora10g/admin/ora10g/udump/ora10g_ora_14042.trc|grep -i --color "RESERVED FREE LISTS:"
RESERVED FREE LISTS:
RESERVED FREE LISTS:
RESERVED FREE LISTS:
RESERVED FREE LISTS:
--可见每个保留区的free list包含14个bucket,共计56个bucket,并且在RESERVED EXTENTS部分会包含每个保留区free list中bucket中的chunk(大家可以这样理解,ORACLE是采用BUCKET来管理分配不同大小的内存)
SQL> host more /home/ora10g/admin/ora10g/udump/ora10g_ora_14042.trc|grep -i --color RESERVED
reserved granule count 46 (granule size 16777216)
RESERVED EXTENTS
reserved granules for root 46 (granule size 16777216)
Chunk 0a1000058 sz= 48 R-freeable "reserved stoppe"
Chunk 0a10ccfd0 sz= 48 R-freeable "reserved stoppe"
Chunk 0a2000058 sz= 48 R-freeable "reserved stoppe"
Chunk 0a20ccfd0 sz= 48 R-freeable "reserved stoppe"
Chunk 0a4000058 sz= 48 R-freeable "reserved stoppe"
Chunk 0a40ccfd0 sz= 48 R-freeable "reserved stoppe"
RESERVED FREE LISTS:
Reserved bucket 0 size=32
Reserved bucket 1 size=4400
Reserved bucket 2 size=8216
Reserved bucket 3 size=8696
Reserved bucket 4 size=8704
Reserved bucket 5 size=8712
Reserved bucket 6 size=8720
Reserved bucket 7 size=9368
Reserved bucket 8 size=9376
Reserved bucket 9 size=12352
Reserved bucket 10 size=12360
Reserved bucket 11 size=16408
Reserved bucket 12 size=32792
Reserved bucket 13 size=65560
Total reserved free space = 2518488
reserved granules for root 46 (granule size 16777216)
Chunk 0a3000058 sz= 48 R-freeable "reserved stoppe"
Chunk 0a30ccfd0 sz= 48 R-freeable "reserved stoppe"
RESERVED FREE LISTS:
Reserved bucket 0 size=32
Reserved bucket 1 size=4400
Reserved bucket 2 size=8216
Reserved bucket 3 size=8696
Reserved bucket 4 size=8704
Reserved bucket 5 size=8712
Reserved bucket 6 size=8720
Reserved bucket 7 size=9368
Reserved bucket 8 size=9376
Reserved bucket 9 size=12352
Reserved bucket 10 size=12360
Reserved bucket 11 size=16408
Reserved bucket 12 size=32792
Reserved bucket 13 size=65560
Total reserved free space = 839496
reserved granules for root 46 (granule size 16777216)
Chunk 0a0000058 sz= 48 R-freeable "reserved stoppe"
Chunk 0a00ccfd0 sz= 48 R-freeable "reserved stoppe"
RESERVED FREE LISTS:
Reserved bucket 0 size=32
Reserved bucket 1 size=4400
Reserved bucket 2 size=8216
Reserved bucket 3 size=8696
Reserved bucket 4 size=8704
Reserved bucket 5 size=8712
Reserved bucket 6 size=8720
Reserved bucket 7 size=9368
Reserved bucket 8 size=9376
Reserved bucket 9 size=12352
Reserved bucket 10 size=12360
Reserved bucket 11 size=16408
Reserved bucket 12 size=32792
Reserved bucket 13 size=65560
Total reserved free space = 839496
reserved granules for root 46 (granule size 16777216)
Chunk 09f000058 sz= 48 R-freeable "reserved stoppe"
Chunk 09f0ccfd0 sz= 48 R-freeable "reserved stoppe"
RESERVED FREE LISTS:
Reserved bucket 0 size=32
Reserved bucket 1 size=4400
Reserved bucket 2 size=8216
Reserved bucket 3 size=8696
Reserved bucket 4 size=8704
Reserved bucket 5 size=8712
Reserved bucket 6 size=8720
Reserved bucket 7 size=9368
Reserved bucket 8 size=9376
Reserved bucket 9 size=12352
Reserved bucket 10 size=12360
Reserved bucket 11 size=16408
Reserved bucket 12 size=32792
Reserved bucket 13 size=65560
Total reserved free space = 839496
SQL>
---调整shared_pool_reserved_size,由值44M增加到60M
SQL> alter system set shared_pool_reserved_size=60m;
alter system set shared_pool_reserved_size=60m
*
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified
SQL> alter system set shared_pool_reserved_size=60m scope=spfile;
System altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORA-32004: obsolete and/or deprecated parameter(s) specified
ORACLE instance started.
Total System Global Area 1157627904 bytes
Fixed Size 2095800 bytes
Variable Size 1040188744 bytes
Database Buffers 83886080 bytes
Redo Buffers 31457280 bytes
Database mounted.
Database opened.
SQL> show parameter shared_pool
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
shared_pool_reserved_size big integer 60M
shared_pool_size big integer 0
可见调整shared_pool_reserved_size,参数_shared_pool_reserved_pct不会进行调整
_shared_pool_reserved_pct 5 percentage memory of the shared pool allocated for
the reserved area
可见共享池大小,不然因为保留区大小调整而变化
__shared_pool_size 872415232 Actual size in bytes of shared pool
---仅列举重点关注的内容,可见和调整shared_pool_reserved_size前没有变化
SQL> host more /home/ora10g/admin/ora10g/udump/ora10g_ora_14757.trc|grep -i --color RESERVED
reserved granule count 46 (granule size 16777216)
RESERVED EXTENTS
reserved granules for root 46 (granule size 16777216)
Chunk 0a1000058 sz= 48 R-freeable "reserved stoppe"
Chunk 0a111efd0 sz= 48 R-freeable "reserved stoppe"
Chunk 0a2000058 sz= 48 R-freeable "reserved stoppe"
Chunk 0a211efd0 sz= 48 R-freeable "reserved stoppe"
Chunk 0a4000058 sz= 48 R-freeable "reserved stoppe"
Chunk 0a411efd0 sz= 48 R-freeable "reserved stoppe"
RESERVED FREE LISTS:
Reserved bucket 0 size=32
Reserved bucket 1 size=4400
Reserved bucket 2 size=8216
Reserved bucket 3 size=8696
Reserved bucket 4 size=8704
Reserved bucket 5 size=8712
Reserved bucket 6 size=8720
Reserved bucket 7 size=9368
Reserved bucket 8 size=9376
Reserved bucket 9 size=12352
Reserved bucket 10 size=12360
Reserved bucket 11 size=16408
Reserved bucket 12 size=32792
Reserved bucket 13 size=65560
Total reserved free space = 3526104
reserved granules for root 46 (granule size 16777216)
Chunk 0a3000058 sz= 48 R-freeable "reserved stoppe"
Chunk 0a311efd0 sz= 48 R-freeable "reserved stoppe"
RESERVED FREE LISTS:
Reserved bucket 0 size=32
Reserved bucket 1 size=4400
Reserved bucket 2 size=8216
Reserved bucket 3 size=8696
Reserved bucket 4 size=8704
Reserved bucket 5 size=8712
Reserved bucket 6 size=8720
Reserved bucket 7 size=9368
Reserved bucket 8 size=9376
Reserved bucket 9 size=12352
Reserved bucket 10 size=12360
Reserved bucket 11 size=16408
Reserved bucket 12 size=32792
Reserved bucket 13 size=65560
Total reserved free space = 1175368
reserved granules for root 46 (granule size 16777216)
Chunk 0a0000058 sz= 48 R-freeable "reserved stoppe"
Chunk 0a011efd0 sz= 48 R-freeable "reserved stoppe"
RESERVED FREE LISTS:
Reserved bucket 0 size=32
Reserved bucket 1 size=4400
Reserved bucket 2 size=8216
Reserved bucket 3 size=8696
Reserved bucket 4 size=8704
Reserved bucket 5 size=8712
Reserved bucket 6 size=8720
Reserved bucket 7 size=9368
Reserved bucket 8 size=9376
Reserved bucket 9 size=12352
Reserved bucket 10 size=12360
Reserved bucket 11 size=16408
Reserved bucket 12 size=32792
Reserved bucket 13 size=65560
Total reserved free space = 1175368
reserved granules for root 46 (granule size 16777216)
Chunk 09f000058 sz= 48 R-freeable "reserved stoppe"
Chunk 09f11efd0 sz= 48 R-freeable "reserved stoppe"
RESERVED FREE LISTS:
Reserved bucket 0 size=32
Reserved bucket 1 size=4400
Reserved bucket 2 size=8216
Reserved bucket 3 size=8696
Reserved bucket 4 size=8704
Reserved bucket 5 size=8712
Reserved bucket 6 size=8720
Reserved bucket 7 size=9368
Reserved bucket 8 size=9376
Reserved bucket 9 size=12352
Reserved bucket 10 size=12360
Reserved bucket 11 size=16408
Reserved bucket 12 size=32792
Reserved bucket 13 size=65560
Total reserved free space = 1175368
---换个思路继续测试,调整_shared_pool_reserved_pct参数,看看保留区变化,可见共享池大小没有变化,且好像shared_pool_reserved_size没有变化,因为shared_pool_reserved_size=shared_pool_size*_shared_pool_reserved_pct
SQL> alter system set "_shared_pool_reserved_pct"=15;
alter system set "_shared_pool_reserved_pct"=15
*
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified
SQL> alter system set "_shared_pool_reserved_pct"=15 scope=spfile;
System altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORA-32004: obsolete and/or deprecated parameter(s) specified
ORACLE instance started.
Total System Global Area 1157627904 bytes
Fixed Size 2095800 bytes
Variable Size 1040188744 bytes
Database Buffers 83886080 bytes
Redo Buffers 31457280 bytes
Database mounted.
Database opened.
SQL>
SQL> show parameter reserved
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_shared_pool_reserved_pct integer 15
shared_pool_reserved_size big integer 60M
SQL> select 872415232*0.15/1024/1024 mb from dual;
MB
----------
124.8
好像调整_shared_pool_reserved_pct参数后,保留区仍没有变化或调整
SQL> host more /home/ora10g/admin/ora10g/udump/ora10g_ora_15156.trc|grep -i "reserved"
reserved granule count 46 (granule size 16777216)
RESERVED EXTENTS
reserved granules for root 46 (granule size 16777216)
Chunk 0a1000058 sz= 48 R-freeable "reserved stoppe"
Chunk 0a111efd0 sz= 48 R-freeable "reserved stoppe"
Chunk 0a2000058 sz= 48 R-freeable "reserved stoppe"
Chunk 0a211efd0 sz= 48 R-freeable "reserved stoppe"
Chunk 0a4000058 sz= 48 R-freeable "reserved stoppe"
Chunk 0a411efd0 sz= 48 R-freeable "reserved stoppe"
RESERVED FREE LISTS:
Reserved bucket 0 size=32
Reserved bucket 1 size=4400
Reserved bucket 2 size=8216
Reserved bucket 3 size=8696
Reserved bucket 4 size=8704
Reserved bucket 5 size=8712
Reserved bucket 6 size=8720
Reserved bucket 7 size=9368
Reserved bucket 8 size=9376
Reserved bucket 9 size=12352
Reserved bucket 10 size=12360
Reserved bucket 11 size=16408
Reserved bucket 12 size=32792
Reserved bucket 13 size=65560
Total reserved free space = 3526104
reserved granules for root 46 (granule size 16777216)
Chunk 0a3000058 sz= 48 R-freeable "reserved stoppe"
Chunk 0a311efd0 sz= 48 R-freeable "reserved stoppe"
RESERVED FREE LISTS:
Reserved bucket 0 size=32
Reserved bucket 1 size=4400
Reserved bucket 2 size=8216
Reserved bucket 3 size=8696
Reserved bucket 4 size=8704
Reserved bucket 5 size=8712
Reserved bucket 6 size=8720
Reserved bucket 7 size=9368
Reserved bucket 8 size=9376
Reserved bucket 9 size=12352
Reserved bucket 10 size=12360
Reserved bucket 11 size=16408
Reserved bucket 12 size=32792
Reserved bucket 13 size=65560
Total reserved free space = 1175368
reserved granules for root 46 (granule size 16777216)
Chunk 0a0000058 sz= 48 R-freeable "reserved stoppe"
Chunk 0a011efd0 sz= 48 R-freeable "reserved stoppe"
RESERVED FREE LISTS:
Reserved bucket 0 size=32
Reserved bucket 1 size=4400
Reserved bucket 2 size=8216
Reserved bucket 3 size=8696
Reserved bucket 4 size=8704
Reserved bucket 5 size=8712
Reserved bucket 6 size=8720
Reserved bucket 7 size=9368
Reserved bucket 8 size=9376
Reserved bucket 9 size=12352
Reserved bucket 10 size=12360
Reserved bucket 11 size=16408
Reserved bucket 12 size=32792
Reserved bucket 13 size=65560
Total reserved free space = 1175368
reserved granules for root 46 (granule size 16777216)
Chunk 09f000058 sz= 48 R-freeable "reserved stoppe" --对应X$KSMSPR,且R-freeable对应X$KSMSPR的列值R-freea
Chunk 09f11efd0 sz= 48 R-freeable "reserved stoppe"
RESERVED FREE LISTS:
Reserved bucket 0 size=32
Reserved bucket 1 size=4400
Reserved bucket 2 size=8216
Reserved bucket 3 size=8696
Reserved bucket 4 size=8704
Reserved bucket 5 size=8712
Reserved bucket 6 size=8720
Reserved bucket 7 size=9368
Reserved bucket 8 size=9376
Reserved bucket 9 size=12352
Reserved bucket 10 size=12360
Reserved bucket 11 size=16408
Reserved bucket 12 size=32792
Reserved bucket 13 size=65560
Total reserved free space = 1175368
--获知与CHUNK分配相关的X视图
SQL> select * from x$kqfta where lower(kqftanam) like '%x$ksmsp%';
ADDR INDX INST_ID KQFTAOBJ KQFTAVER KQFTANAM KQFTATYP KQFTAFLG KQFTARSZ KQFTACOC
---------------- ---------- ---------- ---------- ---------- ------------------------------ ---------- ---------- ---------- ----------
0000000005A592E8 65 1 4294951100 4 X$KSMSP 4 0 88 11
0000000005A59330 66 1 4294951170 3 X$KSMSPR 4 0 88 9
0000000005A594E0 72 1 4294951768 1 X$KSMSP_DSNEW 1 0 6472 8
0000000005A59528 73 1 4294951769 1 X$KSMSP_NWEX 4 0 64 13
可知
X$KSMSPR记录与保留区相关的chunk分配信息,下基于此X表进行分析保留区
可见ksmchptr即上述DUMP中的CHUNK的地址
SQL> select * from x$ksmspr where KSMCHSIZ=48 and ksmchptr='00000000A1000058' or ksmchptr='00000000A111EFD0';
ADDR INDX INST_ID KSMCHCOM KSMCHPTR KSMCHSIZ KSMCHCLS KSMCHTYP KSMCHPAR
---------------- ---------- ---------- ---------------- ---------------- ---------- -------- ---------- ----------------
00002AAB5A233E00 15 1 reserved stoppe 00000000A111EFD0 48 R-freea 0 00
00002AAB5A233D50 17 1 reserved stoppe 00000000A1000058 48 R-freea 0 00
不过DUMP出来的保留区仅6个CHUNK,但如下显示12个CHUNK,余下的6个CHUNK为何没显示在DUMP中呢,此问题先放在这儿
SQL> select * from x$ksmspr where KSMCHSIZ=48;
ADDR INDX INST_ID KSMCHCOM KSMCHPTR KSMCHSIZ KSMCHCLS KSMCHTYP KSMCHPAR
---------------- ---------- ---------- ---------------- ---------------- ---------- -------- ---------- ----------------
00002AAB5A234328 0 1 reserved stoppe 000000009F11EFD0 48 R-freea 0 00
00002AAB5A234278 2 1 reserved stoppe 000000009F000058 48 R-freea 0 00
00002AAB5A234220 3 1 reserved stoppe 00000000A011EFD0 48 R-freea 0 00
00002AAB5A234170 5 1 reserved stoppe 00000000A0000058 48 R-freea 0 00
00002AAB5A234118 6 1 reserved stoppe 00000000A311EFD0 48 R-freea 0 00
00002AAB5A234068 8 1 reserved stoppe 00000000A3000058 48 R-freea 0 00
00002AAB5A234010 9 1 reserved stoppe 00000000A411EFD0 48 R-freea 0 00
00002AAB5A233F60 11 1 reserved stoppe 00000000A4000058 48 R-freea 0 00
00002AAB5A233F08 12 1 reserved stoppe 00000000A211EFD0 48 R-freea 0 00
00002AAB5A233E58 14 1 reserved stoppe 00000000A2000058 48 R-freea 0 00
00002AAB5A233E00 15 1 reserved stoppe 00000000A111EFD0 48 R-freea 0 00
ADDR INDX INST_ID KSMCHCOM KSMCHPTR KSMCHSIZ KSMCHCLS KSMCHTYP KSMCHPAR
---------------- ---------- ---------- ---------------- ---------------- ---------- -------- ---------- ----------------
00002AAB5A233D50 17 1 reserved stoppe 00000000A1000058 48 R-freea 0 00
12 rows selected.
--从另一个维度研究,大家知道保留区也是共享池一部分,正常情况下分配内存只会从FREE LIST及LRU LIST分配,如果我调小参数_shared_pool_reserved_min_alloc,分配内存更会从保留区分配内存,是不是这样呢
,还是为了研究保留区的内存分配一些机制
--注意:仅是为了研究原理与算法,请在生产中不要这样调整
__shared_pool_size 872415232 Actual size in bytes of shared pool
shared_pool_reserved_size 62914560 size in bytes of reserved area of shared pool
---可见默认情况下,从保留区分配内存最小的内存大小为4400字节
_shared_pool_reserved_min_alloc 4400 minimum allocation size in bytes for reserved area
of shared pool
可见调整参数_shared_pool_reserved_min_alloc必须要重启库,且参数必须在4000字节与60m之间,否则数据库无法重启,说明数据库底层对于一些参数调整有非常复杂的算法控制的,不是简单调整一个参数就可以了
SQL> alter system set "_shared_pool_reserved_min_alloc"=10;
alter system set "_shared_pool_reserved_min_alloc"=10
*
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified
SQL> alter system set "_shared_pool_reserved_min_alloc"=100 scope=spfile;
System altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORA-00093: _shared_pool_reserved_min_alloc must be between 4000 and 62914560
SQL>
基于SPFILE调整PFILE,恢复参数_shared_pool_reserved_min_alloc,然后再次重启库
[ora10g@seconary dbs]$ strings spfileora10g.ora|grep reser
*._shared_pool_reserved_min_alloc=100
*._shared_pool_reserved_pct=15
*.shared_pool_reserved_size=62914560
--注意:STRINGS后的文件要清除产生文件无关的条目
[ora10g@seconary dbs]$ strings spfileora10g.ora>initora10g.ora
*._shared_pool_reserved_min_alloc=4400
SQL> startup nomount pfile='/home/ora10g/product/10.2.0/db_1/dbs/initora10g.ora'
ORA-32006: PARALLEL_AUTOMATIC_TUNING initialization parameter has been deprecated
ORACLE instance started.
Total System Global Area 1157627904 bytes
Fixed Size 2095800 bytes
Variable Size 1040188744 bytes
Database Buffers 83886080 bytes
Redo Buffers 31457280 bytes
SQL> create spfile from pfile='/home/ora10g/product/10.2.0/db_1/dbs/initora10g.ora'
2 ;
File created.
SQL> shutdown immediate
ORA-01507: database not mounted
ORACLE instance shut down.
SQL> startup
ORA-32004: obsolete and/or deprecated parameter(s) specified
ORACLE instance started.
Total System Global Area 1157627904 bytes
Fixed Size 2095800 bytes
Variable Size 1040188744 bytes
Database Buffers 83886080 bytes
Redo Buffers 31457280 bytes
Database mounted.
Database opened.
---可见大小48字节已在保留区中分配的CHUNK
SQL> select * from x$ksmspr where KSMCHSIZ=48;
ADDR INDX INST_ID KSMCHCOM KSMCHPTR KSMCHSIZ KSMCHCLS KSMCHTYP KSMCHPAR
---------------- ---------- ---------- ---------------- ---------------- ---------- -------- ---------- ----------------
00002AF0A3240938 0 1 reserved stoppe 000000009C451FD0 48 R-freea 0 00
00002AF0A3240888 2 1 reserved stoppe 000000009C000058 48 R-freea 0 00
00002AF0A3240830 3 1 reserved stoppe 000000009D451FD0 48 R-freea 0 00
00002AF0A3240780 5 1 reserved stoppe 000000009D000058 48 R-freea 0 00
00002AF0A3240728 6 1 reserved stoppe 00000000A3451FD0 48 R-freea 0 00
00002AF0A3240678 8 1 reserved stoppe 00000000A3000058 48 R-freea 0 00
00002AF0A3240620 9 1 reserved stoppe 00000000A4451FD0 48 R-freea 0 00
00002AF0A3240570 11 1 reserved stoppe 00000000A4000058 48 R-freea 0 00
00002AF0A3240518 12 1 reserved stoppe 00000000A2451FD0 48 R-freea 0 00
00002AF0A3240468 14 1 reserved stoppe 00000000A2000058 48 R-freea 0 00
00002AF0A3240410 15 1 reserved stoppe 00000000A1451FD0 48 R-freea 0 00
ADDR INDX INST_ID KSMCHCOM KSMCHPTR KSMCHSIZ KSMCHCLS KSMCHTYP KSMCHPAR
---------------- ---------- ---------- ---------------- ---------------- ---------- -------- ---------- ----------------
00002AF0A3240360 17 1 reserved stoppe 00000000A1000058 48 R-freea 0 00
00002AF0A3240308 18 1 reserved stoppe 00000000A0451FD0 48 R-freea 0 00
00002AF0A3240258 20 1 reserved stoppe 00000000A0000058 48 R-freea 0 00
00002AF0A3240200 21 1 reserved stoppe 000000009F451FD0 48 R-freea 0 00
00002AF0A3240150 23 1 reserved stoppe 000000009F000058 48 R-freea 0 00
00002AF0A32400F8 24 1 reserved stoppe 000000009E451FD0 48 R-freea 0 00
00002AF0A3240048 26 1 reserved stoppe 000000009E000058 48 R-freea 0 00
18 rows selected.
可以用heapdump 12级进行转储,刚好与上述x$ksmspr的条目相同
SQL> oradebug setmypid
Statement processed.
SQL> oradebug dump heapdump 12
ORA-00085: current call does not exist
SQL> oradebug dump heapdump 6
Statement processed.
SQL> oradebug tracefile_name
/home/ora10g/admin/ora10g/udump/ora10g_ora_4300.trc
SQL> host more /home/ora10g/admin/ora10g/udump/ora10g_ora_4300.trc|grep reserved
reserved granule count 5 (granule size 16777216)
reserved granules for root 5 (granule size 16777216)
Chunk 09e000058 sz= 48 R-freeable "reserved stoppe"
Chunk 09e451fd0 sz= 48 R-freeable "reserved stoppe"
Chunk 09f000058 sz= 48 R-freeable "reserved stoppe"
Chunk 09f451fd0 sz= 48 R-freeable "reserved stoppe"
Chunk 0a0000058 sz= 48 R-freeable "reserved stoppe"
Chunk 0a0451fd0 sz= 48 R-freeable "reserved stoppe"
Chunk 0a1000058 sz= 48 R-freeable "reserved stoppe"
Chunk 0a1451fd0 sz= 48 R-freeable "reserved stoppe"
Chunk 0a2000058 sz= 48 R-freeable "reserved stoppe"
Chunk 0a2451fd0 sz= 48 R-freeable "reserved stoppe"
Chunk 0a4000058 sz= 48 R-freeable "reserved stoppe"
Chunk 0a4451fd0 sz= 48 R-freeable "reserved stoppe"
Total reserved free space = 27179952
reserved granules for root 5 (granule size 16777216)
Chunk 0a3000058 sz= 48 R-freeable "reserved stoppe"
Chunk 0a3451fd0 sz= 48 R-freeable "reserved stoppe"
Total reserved free space = 4529992
reserved granules for root 5 (granule size 16777216)
Chunk 09d000058 sz= 48 R-freeable "reserved stoppe"
Chunk 09d451fd0 sz= 48 R-freeable "reserved stoppe"
Total reserved free space = 4529992
reserved granules for root 5 (granule size 16777216)
Chunk 09c000058 sz= 48 R-freeable "reserved stoppe"
Chunk 09c451fd0 sz= 48 R-freeable "reserved stoppe"
Total reserved free space = 4529992
我们需要知道
经过在UE进行查找分析比对,可见
x$ksmspr显示为标黄的内容,即KSMCHCLS=R-freea ,对应DUMP中的状态为R-freeable,这部分内存对应reserved stoppe
而reserved free list中的chunk对应ksmchlcs=R-free,且这部分内存可以自由分配
RESERVED FREE LISTS:
Reserved bucket 0 size=32
Reserved bucket 1 size=4400
Reserved bucket 2 size=8216
Reserved bucket 3 size=8696
Reserved bucket 4 size=8704
Reserved bucket 5 size=8712
Reserved bucket 6 size=8720
Reserved bucket 7 size=9368
Reserved bucket 8 size=9376
Reserved bucket 9 size=12352
Reserved bucket 10 size=12360
Reserved bucket 11 size=16408
Reserved bucket 12 size=32792
Reserved bucket 13 size=65560
Chunk 09e000088 sz= 4529992 R-free " "
Chunk 09f000088 sz= 4529992 R-free " "
Chunk 0a0000088 sz= 4529992 R-free " "
Chunk 0a1000088 sz= 4529992 R-free " "
Chunk 0a2000088 sz= 4529992 R-free " "
Chunk 0a4000088 sz= 4529992 R-free " "
Total reserved free space = 27179952
--可见4529992字节对应的CHUNK即未在保理区分配的内存CHUNK
SQL> select * from x$ksmspr where KSMCHSIZ=4529992;
ADDR INDX INST_ID KSMCHCOM KSMCHPTR KSMCHSIZ KSMCHCLS KSMCHTYP KSMCHPAR
---------------- ---------- ---------- ---------------- ---------------- ---------- -------- ---------- ----------------
00002B8C55D385F0 1 1 free memory 000000009C000088 4529992 R-free 0 00
00002B8C55D384E8 4 1 free memory 000000009B000088 4529992 R-free 0 00
00002B8C55D383E0 7 1 free memory 000000009D000088 4529992 R-free 0 00
00002B8C55D382D8 10 1 free memory 00000000A3000088 4529992 R-free 0 00
00002B8C55D381D0 13 1 free memory 00000000A4000088 4529992 R-free 0 00
00002B8C55D380C8 16 1 free memory 00000000A2000088 4529992 R-free 0 00
00002B8C55D37FC0 19 1 free memory 00000000A1000088 4529992 R-free 0 00
00002B8C55D37EB8 22 1 free memory 00000000A0000088 4529992 R-free 0 00
00002B8C55D37DB0 25 1 free memory 000000009F000088 4529992 R-free 0 00
00002B8C55D37CA8 28 1 free memory 000000009E000088 4529992 R-free 0 00
10 rows selected.
可见用于保留区的有2种不同的大小,1个为4529992字节,1个为48字节
SQL> select ksmchsiz,count(*) from x$ksmspr group by ksmchsiz;
KSMCHSIZ COUNT(*)
---------- ----------
4529992 10
48 20
而且x$ksmsp是x$ksmspr的父集,即前者包含后者
SQL> select * from x$ksmspr where ksmchcom='free memory';
ADDR INDX INST_ID KSMCHCOM KSMCHPTR KSMCHSIZ KSMCHCLS KSMCHTYP KSMCHPAR
---------------- ---------- ---------- ---------------- ---------------- ---------- -------- ---------- ----------------
00002B8C55D381D8 1 1 free memory 000000009C000088 4529992 R-free 0 00
00002B8C55D380D0 4 1 free memory 000000009B000088 4529992 R-free 0 00
00002B8C55D37FC8 7 1 free memory 000000009D000088 4529992 R-free 0 00
00002B8C55D37EC0 10 1 free memory 00000000A3000088 4529992 R-free 0 00
00002B8C55D37DB8 13 1 free memory 00000000A4000088 4529992 R-free 0 00
00002B8C55D37CB0 16 1 free memory 00000000A2000088 4529992 R-free 0 00
00002B8C55D37BA8 19 1 free memory 00000000A1000088 4529992 R-free 0 00
00002B8C55D37AA0 22 1 free memory 00000000A0000088 4529992 R-free 0 00
00002B8C55D37998 25 1 free memory 000000009F000088 4529992 R-free 0 00
00002B8C55D37890 28 1 free memory 000000009E000088 4529992 R-free 0 00
10 rows selected.
SQL> select * from x$ksmsp where rownum<=10;
ADDR INDX INST_ID KSMCHIDX KSMCHDUR KSMCHCOM KSMCHPTR KSMCHSIZ KSMCHCLS KSMCHTYP KSMCHPAR
---------------- ---------- ---------- ---------- ---------- ---------------- ---------------- ---------- -------- ---------- ----------------
00002B8C55F75E00 0 1 1 4 sql area 000000009CFFF000 4096 recr 4095 000000009DDD38C8
00002B8C55F75DA8 1 1 1 4 KGLS heap 000000009CFFEBA8 1112 recr 4095 000000009DFFDC48
00002B8C55F75D50 2 1 1 4 sql area 000000009CFFDBA8 4096 recr 4095 000000009DFF5EF0
00002B8C55F75CF8 3 1 1 4 KGLS heap 000000009CFFD750 1112 freeabl 0 000000009DFE5520
00002B8C55F75CA0 4 1 1 4 sql area 000000009CFFC750 4096 recr 4095 000000009DF578B8
00002B8C55F75C48 5 1 1 4 free memory 000000009CFFC6E8 104 free 0 00
00002B8C55F75BF0 6 1 1 4 KGLS heap 000000009CFFC290 1112 freeabl 0 000000009DF91C68
00002B8C55F75B98 7 1 1 4 KGLS heap 000000009CFFBE38 1112 recr 4095 000000009DF9B018
00002B8C55F75B40 8 1 1 4 repository 000000009CFFBBA8 656 freeabl 0 000000009DF72CF0
00002B8C55F75AE8 9 1 1 4 KGLS heap 000000009CFFB750 1112 freeabl 0 000000009DFE36B8
10 rows selected.
SQL> select * from x$ksmsp where rownum<=10 and ksmchptr='000000009C000088';
ADDR INDX INST_ID KSMCHIDX KSMCHDUR KSMCHCOM KSMCHPTR KSMCHSIZ KSMCHCLS KSMCHTYP KSMCHPAR
---------------- ---------- ---------- ---------- ---------- ---------------- ---------------- ---------- -------- ---------- ----------------
00002B8C55F00498 4638 1 1 4 free memory 000000009C000088 4529992 R-free 0 00
SQL> select * from x$ksmsp where rownum<=10 and ksmchptr='000000009F000088';
ADDR INDX INST_ID KSMCHIDX KSMCHDUR KSMCHCOM KSMCHPTR KSMCHSIZ KSMCHCLS KSMCHTYP KSMCHPAR
---------------- ---------- ---------- ---------- ---------- ---------------- ---------------- ---------- -------- ---------- ----------------
00002B8C55D35638 21128 1 1 1 free memory 000000009F000088 4529992 R-free 0 00