设为首页 加入收藏

TOP

技术日记-150726
2015-11-21 01:31:52 来源: 作者: 【 】 浏览:0
Tags:技术 日记 -150726

上海 晴转阵雨 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、句柄的意思。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇《Redis设计与实现》学习笔记-单.. 下一篇《Redis设计与实现》学习笔记-Lua..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: