
介紹free lists及shared pool lru list. free list 空閑列表 按bucket劃分,共有255個,bucket 0---bucket 254 每個bucket上掛有一個 chunk list; free lists上的都是未使用的chunk RESERVED FREE LISTS: RESERVED FREE LISTS上的bucket個數我DUMP出來的是15
介紹free lists及shared pool lru list.
free list 空閑列表
按bucket劃分,共有255個,bucket 0---bucket 254
每個bucket上掛有一個 chunk list; free lists上的都是未使用的chunk
RESERVED FREE LISTS:
RESERVED FREE LISTS上的bucket個數我DUMP出來的是15個。
保留FREE LISTS,在SQL語句所需CHUNK大于4400bytes時,會在RESERVED FREE LISTS中查找空閑CHUNK。
如果SQL語句所需CHUNK不大于4400bytes時,只會在free list 中查找CHUNK。
這個是由隱含參數控制的:_shared_pool_reserved_min_alloc minimum allocation size in bytes for reserved area ,默認值4400
###################
DUMP 共享池查看free lists/bucket/RESERVED FREE LISTS結構:--用新建會話來做
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
查看TRACE文件內容: --找這一段的方法:VI搜索HEAP DUMP
Chunk 2bffa844 sz= 22460 freeable "character set m"
Total heap size =146798680 -- 146798680/1024/1024 --139.99813 初始化參數:shared_pool_size--140M
FREE LISTS: ------空閑列,可以明顯看出bucket大小分配的規律--從小到大,共有255個buckets,從16bytes到64k,采用此方法分配內存,可以有效的減少內存碎片。每個Bucket之間都用double linked 相互連接
Bucket 0 size=16
Chunk 2bc00048 sz= 0 kghdsx
Bucket 1 size=20 20字節的Bucket 1,有很多個Chunk,節約篇幅省略了
Chunk 23a60468 sz= 20 free " "
Chunk的地址、大小、狀態
Chunk 23ceb498 sz= 20 free " "
Chunk 237fcde4 sz= 20 free " "
Bucket 2 size=24 --Bucket 2 --24字節
Chunk 245b13e4 sz= 24 free " "
Chunk 23ace7c0 sz= 24 free " "
Chunk 239c5a28 sz= 24 free " "
Bucket 3 size=28
Chunk 24540e9c sz= 28 free " "
Chunk 2521209c sz= 28 free " "
Chunk 23483448 sz= 28 free " "
……
Bucket 252 size=16396
Bucket 253 size=32780
Bucket 254 size=65548
Total free space = 518232
RESERVED FREE LISTS: --保留FREE LISTS,解析方法同上。保留池中CHUNK都比較大
Reserved bucket 0 size=16
Chunk 23420320 sz= 676 R-free " "
Chunk 23427b94 sz= 3420 R-free " "
Chunk 2342618c sz= 952 R-free " "
Chunk 23800050 sz= 1040 R-free " "
Chunk 23400050 sz= 2824 R-free " "
Chunk 25bff028 sz= 4032 R-free " "
Chunk 293ff788 sz= 2144 R-free " "
Reserved bucket 1 size=4400 --這個如果用的會,4564-4400,剩下164字節會成為新CHUNK
Chunk 23430a40 sz= 4564 R-free " "
Reserved bucket 2 size=8204
Reserved bucket 3 size=8460
Reserved bucket 4 size=8464
Reserved bucket 5 size=8468
Reserved bucket 6 size=8472
Chunk 2342b988 sz= 9136 R-free " "
Reserved bucket 7 size=9296
Reserved bucket 8 size=9300
Reserved bucket 9 size=12320
Reserved bucket 10 size=12324
Reserved bucket 11 size=16396
Chunk 234161f8 sz= 16448 R-free " "
Reserved bucket 12 size=32780
Reserved bucket 13 size=65548
Chunk 23401d50 sz= 72296 R-free " "
Chunk 23815668 sz= 125312 R-free " "
Chunk 23c00050 sz= 180380 R-free " "
Reserved bucket 14 size=1990652
Total reserved free space = 6712468 --總空閑保留空間是6.4M,shared_pool_reserved_size 初始化參數大小是 7M,用了0.6M
######################
shared pool LRU鏈
shared pool LRU鏈上掛的都是recreate狀態的chunk,一個SQL語句可能需要多個CHUNK,在LRU鏈上找到recreate狀態的chunk,然后在recreate狀態的chunk下再下掛freeabl狀態的CHUNK,--避免全部CHUNK在LRU鏈上導致LRU鏈太長。
TRACE文件中找到關于(lru first)的一段,方法同上:
Reserved bucket 14 size=1990652
Total reserved free space = 6712468
UNPINNED RECREATABLE CHUNKS (lru first):
Chunk 246c9848 sz= 348 recreate "KGLHD " latch=(nil) --latch狀態為空,Chunk SIZE是348字節,狀態recreate,
Chunk 237cb10c sz= 4096 recreate "KGLH0^b9197c6e " latch=(nil)
Chunk 24bb5df0 sz= 364 recreate "KGLHD " latch=(nil)
Chunk 241aa1b8 sz= 4096 recreate "KGLH0^59449e50 " latch=(nil)
Chunk 252640a0 sz= 364 recreate "KGLHD " latch=(nil)
Chunk 23a619a0 sz= 4096 recreate "KGLH0^d5f1e0d7 " latch=(nil)
Chunk 23465600 sz= 348 recreate "KGLHD " latch=(nil)
Chunk 2346575c sz= 1036 recreate "KGLHD " latch=(nil)
Chunk 23465b68 sz= 4096 recreate "KGLH0^c6e0d102 " latch=(nil) --一個recreate狀態CHUNK下的多個freeable狀態CHUNK
ds 24bdecb0 sz= 4096 ct= 1
Chunk 23466b68 sz= 4096 freeable "SQLA^1536bb77 " ds=0x23db5bd8
Chunk 23467b68 sz= 144 freeable "KGLDA "
Chunk 23467bf8 sz= 4096 freeable "KGLH0^ba3f9b05 " ds=0x2425e238
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com