关于Heap中的一些概念

来源:这里教程网 时间:2026-03-03 16:11:39 作者:

 

Oracle的内存是以heap的形式进行管理,这包括常见的SGA和PGA。
- 物理形式上,一个内存heap包括header或者header descriptor以及一些extents 。
- 逻辑形式上,一个heap可能包含多个subheap。subheap中的extents来源于它的父heap;heap和subheap通过free lists和LRU lists来管理空闲以及使用的空间。
PS. 什么是subheap,举个例子,Shared pool的subpool是Shared Pool这个heap的subheap。

 

 

Heap是逻辑上的结构,其包含:
- Descriptor(DS)
- 连续的内存片,也就是extents

 

一个Heap Descriptor又包含:
- 指向父heap的指针
- 指向已经分配的extents list
- 指向permanent类型的chunks list

 

 

每个Extents又包含
- 其父heap的Descriptor
- 指向下一个extent的Pointer
- 每个extent又被逻辑的细分为多个chunks

 

关系如下图

 

每个chunk所包含的
- Control bits
- Magic bits
- Chunk size
- 指向前一个chunk的Pointer(同一个Extent中)
- 每个chunk的内存地址加上length,就是下一个chunk的内存地址。

 

对于诊断来说,这里除了chunk size对4031方向的问题有点作用外,其他可忽略,主要是针对内存讹误问题时研发分析的依据。

 

 

chunk的管理组织上:
- 以size区间形式划分为多个bucket的形式
- free list上包含free chunk的地址和大小
- LRU list上包含之前使用的chunk的地址和大小

 

chunk的类型上:
- Free
- Freeable
- Recreateable
- Permanent
前缀带R的就是保留池中的。对于4031来说,申请的是Free,没有继续看是否能从LRU list上Recreateable unpined中获得空间(这部分也是可以被主动flush的),另外当freeable不被使用后(freeable代表当前正在被用),也可以释放。这类可重用的在heapdump中都有个明显的U的后缀,代表unpined。

相关推荐