介紹shared pool物理結構的heap 堆,extent 區,chunk
記憶體中:共用池、大池、PGA是heap管理
shared pool物理層面上由許多記憶體塊組成,這些內在塊稱為chunk,chunk是shared pool中記憶體配置最小單位-類似extent,但是chunk是大小不一的,在記憶體中一個chunk是連續的。
chunk屬於可用類型的時候,既不屬於library cache,也不屬於dictionary cache,
如果chunk被用於存放SQL相關的資料時,則該chunk就屬於library cache;
如果該chunk被用於存放資料字典的資訊時,則該chunk就是屬於dictionary
Chunk可以分為4類-或者叫4種狀態:
1.free:chunk中沒有有效對象,可以不受限制的分配
2.recr:recreatable,--可重用的,chunk裡麵包含的對象可以被臨時性的移 走,如果需要,可以重建,例如共用SQL語句
3.freeabl:--可釋放的,session用過這個chunk,裡面存放的對象資料是session 在處理過程中產生的,沒有辦法重建,這點不同於recr。因此這個chunk不能被臨時性的移走。但是在合適的時間段可以被釋放。
4.perm:permanent,--永久的SGA的固定對象等,chunk中包含永久性的對象,但是大型的permanent類型的chunk中可能包含可用空間,需要的時候,這些空間可以被釋放。
x$ksmsp名稱含義為: kernal storage memory management sga heap
注意:據說在10.1.0.2版本中某些平台上查詢此視圖會有BUG導致CPU過載
SYS@ bys3>desc x$ksmsp
Name
------------
ADDR --x$ksmsp視圖中一行資訊在記憶體中地址
INDX --
INST_ID --
KSMCHIDX --
KSMCHDUR --
KSMCHCOM --chunk描述
KSMCHPTR --CHUNK地址
KSMCHSIZ --代表chunk大小
KSMCHCLS --chunk類型--freeabl-recr-perm-free
KSMCHTYP --
KSMCHPAR --父物件的地址--可能是.KGLOBHD0
SYS@ bys3>select count(*) from x$ksmsp; --每個chunk在x$ksmsp中都有記錄,可以統計出chunk數量
COUNT(*)
----------
18224
SYS@ bys3>select * from bys.test;
SYS@ bys3>select * from bys.test where status=2;
SYS@ bys3>select count(*) from x$ksmsp;
COUNT(*)
----------
18251
如資料庫存在大量硬解析,不停請求分配free的共用池記憶體,會引起shared pool latch,以及shared pool產生更多片段。--記憶體回收時,chunk數量會減少。
SYS@ bys3>select distinct(ksmchcls) from x$ksmsp;
KSMCHCLS
--------
freeabl
recr
perm
R-freea
R-free
R-perm
free
R-recr
SYS@ bys3>select KSMCHCLS,count(*) ,round(sum( KSMCHSIZ/1024/1024),0) MB,round(avg(KSMCHSIZ),0) from x$ksmsp group by KSMCHCLS order by 1;
KSMCHCLS COUNT(*) MB ROUND(AVG(KSMCHSIZ),0)
-------- ---------- ---------- ----------------------
R-free 43 6 152374
R-freea 98 0 3915
R-perm 4 16 4111578
R-recr 1 4 3977200
free 1937 0 226
freeabl 5815 11 2057
perm 271 89 343653
recr 11127 13 1250
###################
SubPool 子池
SubPool:最多7個 (4cpu-->1,128M(9i),256M(10g),512M(11g))
alter system set "_kghdsidx_count"=2 scope=spfile;
DUMP 共用池查看heap/extent/chunk結構:--用建立會話來做
alter session set events 'immediate trace name heapdump level 2';
select value from v$diag_info where name like 'De%';
/u01/diag/rdbms/bys3/bys3/trace/bys3_ora_7876.trc
******************************************************
desc=0x200010b4
ad4 alt=124 het=32767 rec=9 flg=-126 opc=0 --ad4 轉換為十進位大小是:31444
parent=(nil) owner=(nil) nex=(nil) xsz=0x0 heap=(nil)
fl2=0x60, nex=(nil)
ds for latch 1: 0x20030f24
reserved granule count 0 (granule size 4194304)
******************************************************
desc=0x20030f24
--進階堆的子緩衝區--共用池的
4 alt=124 het=32767 rec=9 flg=-126 opc=0 ,更大的在保留池
parent=(nil) owner=(nil) nex=(nil) xsz=0x400000 heap=(nil)
fl2=0x20, nex=(nil), dsxvers=1, dsxflg=0x0
dsx first ext=0x2c400000
latch set 1 of 1
durations disabled for this heap
reserved granules for root 0 (granule size 4194304)
,一個有多個Chunk
Chunk 23c00038 sz= 24 R-stopper "reserved stoppe"
Chunk 23c00050 sz= 14300 R-free " "
Chunk 23c0382c sz= 8224 R-freeable "KKSSP^38 " ds=0x23d8f480
Chunk 23c0a8e4 sz= 169732 R-free " "
Chunk 23c33fe8 sz= 24 R-stopper "reserved stoppe"
Chunk 23c34000 sz= 15776 perm "perm " alo=15776
狀態的CHUNK,23c37da0 記憶體位址,84位元組,可以看到各chunk大小不一
狀態的CHUNK, 沒有latch
Chunk 23bfadc8 sz= 4124 freeable "PLMCD^f24c7997 " ds=0x24609ea8
Chunk 23bfbde4 sz= 4096 recreate "SQLA^9d1660bd " latch=(nil)
ds 23f49e9c sz= 12288 ct= 3
24177984 sz= 4096
239fa8bc sz= 4096
…………………………
有很多個。。
Chunk 2ac00038 sz= 24 R-stopper "reserved stoppe"
Chunk 2ac00050 sz= 212888 R-free " "
Chunk 2ac33fe8 sz= 24 R-stopper "reserved stoppe"
Chunk 2ac34000 sz= 3971084 perm "perm " alo=3971084
Chunk 2affd80c sz= 10096 perm "perm " alo=10096
Chunk 2affff7c sz= 28 freeable "PRESENTATION EN"
Chunk 2affff98 sz= 104 freeable "Label Cache Hea"
EXTENT 31 addr=0x2b000000