Oracle内存管理:堆

看了 oracleinstanceturning觉得这块讲的特别好,与大家共享。欢迎大家补充,以便对oracle内存管理等有更深刻的理解。

堆和子堆的概念
1 oracle是以堆作为内存的管理的基本单位的
2 物理上,一个内存堆,包含:
  1)堆头,和堆的描述符
  2)一个多个区extents
3 逻辑上:一个堆包含了许多子堆
  1)在子堆中的extents是从其父堆中分配的
  2)堆和子堆有free list,LRU list去管理未使用的和已经使用的空间
4 内存管理
    内存空间是以堆的形式有机的组织起来的。在物理结构上,一个堆含有一个头和一个堆的描述符,还有一些分配给该堆的区(extents).当空间从区中分配或者回收的时候,碎片就产生了。每一个碎片称做块(chunk)。这些块可以是已经分配的,也可以是未被分配的。注意:一次对空间的请求可以比任何单独的区都大。但是这并不是一个什么问题,因为一个空间的请求可以通过从不同的区的不同的chunks而得到。在一个堆内,可以请求永久分配的空间,也可以请求可以被释放和被重新再次使用的空间。当一个有可能被释放的块空间被分配时,这个块被标记为recreatable,在这种情况下,当这种空间没有被使用的时候,这些块是明白没有被闩住的(unpinned).

    当一个用户从堆中请求空间的时候,首先搜索free list。然而,如果没有足够的可用空间,堆管理器可以unpin recreateable chunks。被释放闩锁的块的空间被放在LRU LIST,以便让堆管理器决定应该首先释放哪一个块。如果仍然没有找到合适的chunk,那么堆管理器请求一个新的区,并且把它加到该堆中。如果该一个堆中的区是从另外一个区中分配的(比如UGA从PGA中分配),那么就说该堆就是另一个堆的子堆。如果仍然没有足够的区可以分配,那么就会报错。


参见:http://www.itpub.net/thread-804035-1-1.html

你可能感兴趣的:(Oracle内存管理:堆)