技术日记-150726

来源:互联网 发布:java无参数函数调用 编辑:程序博客网 时间:2024/06/06 01:42

上海   晴转阵雨     37摄氏度

日记只是未整理的笔记,是其他的文章的雏形,适用于于本人看。


共享池

共享池最小的内存分配单元是块(Chunk),chunk的大小不统一。

4031错误: 共享内存池不足。

共享池分形结构

共享池最上面一层是堆(HEAP),每个堆中,没划分成多个大小相关的区(Extent),么个区又包含大小不等的ChunkChunk又可以看成一个子堆,然后包含多个大小相关的区.....

共享池内存分配方式:

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链表

只有类型为RecrChunk,才会放到LRU链中。

FreeList链表只有freeChunk

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解析会包含多个ChunkChunk最大是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、句柄的意思。


0 0
原创粉丝点击