上海 晴转阵雨 37摄氏度
日记只是未整理的笔记,是其他的文章的雏形,适用于于本人看。
共享池
共享池最小的内存分配单元是块(Chunk),chunk的大小不统一。
4031错误: 共享内存池不足。
共享池分形结构
共享池最上面一层是堆(HEAP),每个堆中,没划分成多个大小相关的区(Extent),么个区又包含大小不等的Chunk。Chunk又可以看成一个子堆,然后包含多个大小相关的区.....
共享池内存分配方式:
1)从Top Heap张分配;
2)从子堆中分配
从子堆中分配,如果子堆的区空间已经分配完,则从子堆的父堆的区中分配一个新的Chunk(第二种方法触发了第一种方法。)如果Top堆中的所有与区已经分配完毕,而且没有可以释放的内存,将会报出ORA-4031错误。
子堆的每一个Extent对应父堆的一个Chunk。
子堆实际上市一个虚拟的概念,DS相当于一个子堆的说明,它不占用子堆空间,指向子堆的第一个Chunk。子堆事实上市一个双向链表,他们分布在父堆的不同位置,而且并不一定相连,同时位置顺序并不和子堆中Extent顺序相同。
Chunk 类型
1)Free: 空闲的Chunk
2)Perm:永久的Chunk
3)Recreatable:可重建的Chunk
4)Freeable:
X$ksmsp视图专门用于记录共享池堆所有chunk的情况。
X$KSMSP:kernal Storage Memory Sga HeaP
77
Select ksmchcls from x$ksmsp
Freeabl 和recr用于SQL。
共享池LRU链表
只有类型为Recr的Chunk,才会放到LRU链中。
FreeList链表只有free的Chunk。
Chunk的释放是指将Chunk一刀FreeList链了。
LRU链中的子堆元素: 子堆包含多个Chunk,一般在SQL解析运行期间,这几个chunk是同进退,同时可以释放。因此在LRU链中,只选出子堆中的一个代表加入到LRU链,这样的方式可以显著减少LRU长度。
而非代表的子堆中的Chunk都是freeable类型。当LRU链中的代表Chunk被释放后,freeable链怎么办呢,ORacle处理很简单,在recr类型chunk被覆盖掉,freeable类型可能会跟着被覆盖掉或者类型变为free,加到freelist中。
几乎所有freeable类型的chunk都是子堆的一部分,但recr不一定是子堆的一部分。
Bucket: HASH表中的概念,链表头
怎样从Free list分配内存。
共享池的Free List找到分配Chunk,事实上就是在Free List上找到合适大小的Chunk,如果找到就分配,找不到从较大Chunk切割。
这样会产生碎片,但是Oracle不会合并相邻的碎片。
解决方法:保留池
共享池中Chunk不断切割,导致后续Chunk不断碎片化,导致最后需要较大Chunk时, 找不到合适的Chunk。保留池就是为了较大Chunk保留的Chunk,保留池中的Chunk不会被切割。
保留池只有大于等于4400字节的Chunk
保留池需要设置相关参数:
保留池默认大小:shared_pool_reserved_size 默认10%
保留池最小分配大小: _shared_pool_reserved_min_alloc 默认 4400 (大于4096是为了防止SQL解析占用,一把SQL解析会包含多个Chunk,Chunk最大是4096)
SQL: 通过用SQL语句的每个文本字符计算HASH值的。
X$KGLOB--[K]ernel [G]eneric [L]ibrary Cache Manager [OB]ject
Note:X$KGLPN--[K]ernel [G]eneric [L]ibrary Cache Manager object [P]i[N]s
HD是handle、句柄的意思。