共享内存 share pool :heap /extent /chunk/

相关概念

  • CHUNK: Shared pool物理层面上由许多内存块组成,这些内在块称为chunk。但是chunk是大小不一的,在内存中一个chunk是连续的。
  • EXTENT:由多个连续的chunk组成
  • HEAP: 堆由一个或多个大小不一的extent组成

将shool pool内存dump出来

将shool pool内存dump出来:

[[email protected] ~]$ sqlplus /nolog
SQL> conn /as sysdba
SQL> alter session set events ‘immediate trace name heapdump level 2‘;
SQL> select value from v$diag_info where name like ‘De%‘;
VALUE
--------------------------------------------------------------------------------
/u01/diag/rdbms/oracle/beijing/trace/beijing_ora_14649.trc

SQL> 

解释文件中各个部分

******************************************************
Trace file /u01/diag/rdbms/oracle/beijing/trace/beijing_ora_9252.trc
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORACLE_HOME = /u01/app
System name:    Linux
Node name:    oracle.11g
Release:    2.6.9-55.EL
Version:    #1 Wed May 2 13:52:16 EDT 2007
Machine:    i686
Instance name: beijing
Redo thread mounted by this instance: 1
Oracle process number: 36
Unix process pid: 9252, image: oracle@oracle.11g (TNS V1-V3)

*** 2015-03-11 09:29:17.546
*** SESSION ID:(46.362) 2015-03-11 09:29:17.546
*** CLIENT ID:() 2015-03-11 09:29:17.546
*** SERVICE NAME:(SYS$USERS) 2015-03-11 09:29:17.546
*** MODULE NAME:(sqlplus@oracle.11g (TNS V1-V3)) 2015-03-11 09:29:17.546
*** ACTION NAME:() 2015-03-11 09:29:17.546

    这部分是关于trace文件的基本信息,oracle版本、资源情况、用户和会话等
******************************************************

KGH Latch Directory Information
ldir state: 2  last allocated slot: 99
Slot [  1] Latch: 0x200065ec  Index: 1  Flags:  3  State: 2  next:  (nil)
Slot [  2] Latch: 0x387af42c  Index: 1  Flags:  3  State: 2  next:  (nil)
Slot [  3] Latch: 0x387af4b4  Index: 1  Flags:  3  State: 2  next:  0x200a7f60
Slot [  4] Latch: 0x200087dc  Index: 1  Flags:  3  State: 2  next:  (nil)
........

 这部分记录的是shared pool中的latch信息。每个latch的具体信息可以通过视图V$LATCH、V$LATCH_PARENT、V$LATCH_CHILDREN或者表x$ksllt查出
******************************************************

HEAP DUMP heap name="sga heap"  desc=0x200010b4
 extent sz=0x7ad4 alt=124 het=32767 rec=9 flg=-126 opc=0
 parent=(nil) owner=(nil) nex=(nil) xsz=0x0 heap=(nil)
 fl2=0x60, nex=(nil)
 ds for latch 1: 0x2002a6f0 0x2002b328 0x2002bf60 0x2002cb98
 reserved granule count 0 (granule size 4194304)

 这是堆dump信息的头部,heap name说明了内存所述的堆,shared pool是属于SGA区的,因此,这里是"sga heap"
******************************************************

HEAP DUMP heap name="sga heap(1,0)"  desc=0x2002a6f0
 extent sz=0xfc4 alt=124 het=32767 rec=9 flg=-126 opc=0
 parent=(nil) owner=(nil) nex=(nil) xsz=0x400000 heap=(nil)
 fl2=0x20, nex=(nil)
 latch set 1 of 1
 durations enabled for this heap
 reserved granules for root 0 (granule size 4194304)

 先了解两个概念:子缓冲池,子分区。
 从Oracle 9i开始,Shared Pool可以被分割为多个子缓冲池(SubPool)进行管理,以提高并发性,减少竞争。Shared Pool的每个SubPool可以被看作是一个Mini Shared Pool,拥有自己独立的Free List、内存结构以及LRU List。

 当仅有一个子缓冲池时,Shared Pool被划分为sga heap(1,0)~sga heap(1,3),共4个子分区
 HEAP DUMP heap name="sga heap(1,0)"  desc=0x2002a6f0
 HEAP DUMP heap name="sga heap(1,1)"  desc=0x2002b328
 HEAP DUMP heap name="sga heap(1,2)"  desc=0x2002bf60
 HEAP DUMP heap name="sga heap(1,3)"  desc=0x2002cb98

 当使用两个子缓冲池时,Shared Pool则被划分为8个子分区进行管理:
 HEAP DUMP heap name="sga heap(1,0)"
 HEAP DUMP heap name="sga heap(1,1)"
 HEAP DUMP heap name="sga heap(1,2)"
 HEAP DUMP heap name="sga heap(1,3)"
 HEAP DUMP heap name="sga heap(2,0)"
 HEAP DUMP heap name="sga heap(2,1)"
 HEAP DUMP heap name="sga heap(2,2)"
 HEAP DUMP heap name="sga heap(2,3)"

******************************************************
EXTENT 0 addr=0x33800000
  Chunk 33800038 sz=       24  R-freeable  "reserved stoppe"
  Chunk 33800050 sz=   212888  R-free      "               "
  Chunk 33833fe8 sz=       24  R-freeable  "reserved stoppe"
  Chunk 33834000 sz=  3981312    perm      "perm           "  alo=1227684
.......
.......
EXTENT 16 addr=0x39000000 --起始地址
  Chunk 39000038 sz=       24  R-freeable  "reserved stoppe" --39000038为十六进制地址,sz为Chunk大小
  Chunk 39000050 sz=   212888  R-free      "               "
  Chunk 39033fe8 sz=       24  R-freeable  "reserved stoppe"
  Chunk 39034000 sz=  3980148    perm      "perm           "  alo=3980148
  Chunk 393ffb74 sz=     1016    perm      "perm           "  alo=1016
  Chunk 393fff6c sz=      148    free      "               "
Total heap size    = 71302216                                --这一shared pool区的总的大小

    每个分区中的EXTENT都是由连续,但大小不等的Chunk组成。

    Chunk可以分为4类-或者叫4种状态:
    1.free:chunk中没有有效的对象,可以不受限制的分配
    2.recr:recreatable,--可重用的,chunk里面包含的对象可以被临时性的移    走,如果需要,可以重建,例如共享SQL语句
    3.freeabl:--可释放的,session用过这个chunk,里面存放的对象数据是session    在处理过程中产生的,没有办法重建,这点不同于recr。因此这个chunk不能被临时性的移走。但是在合适的时间段可以被释放。
    4.perm:permanent,--永久的SGA的固定对象等,chunk中包含永久性的对象,但是大型的permanent类型的chunk中可能包含可用空间,需要的时候,这些空间可以被释放。

******************************************************

参考blog:

http://blog.csdn.net/haibusuanyun/article/details/17803523

http://www.hellodba.com/reader.php?ID=111&lang=CN

http://book.51cto.com/art/201001/177241.htm

时间: 2024-08-09 09:14:44

共享内存 share pool :heap /extent /chunk/的相关文章

共享内存 share pool :BUCKET /FREE LISTS /RESERVED FREE LISTS /UNPINNED RECREATABLE CHUNKS (lru first)

相关概念 BUCKET :每个bucket上挂有一个 chunk list.同一个BUCKET中的chunk在物理地址上是不一定相邻的 FREE LISTS:按bucket划分,共有255个,bucket 0---bucket 254 RESERVED FREE LISTS:在SQL语句所需CHUNK大于4400bytes时,会在RESERVED FREE LISTS中查找空闲CHUNK.如果SQL语句所需CHUNK不大于4400bytes时,只会在free list 中查找CHUNK. Sha

调优3(share pool 调整)

第三章 share pool 调整 1.sga 组成部分 1)database buffer2)redolog buffer3)share pool :共享池,存放最近最常使用的sql和plsql语句及解析计划和数据字典信息---library cache: 存放最近最常使用的sql及plsql 语句和执行计划.解析代码(采用LRU算法)---Dictionary cache:存放最近最常使用的数据字典信息(表.字段.权限等)---uga :用户全局区(如果server process 是专有模

Linux进程间通信--共享内存

一.共享内存定义 (百度百科)共享内存指在多处理器的计算机系统中,可以被不同中央处理器访问的大量内存.由于多个CPU需要快速访问存储器,这样就要对存储器进程缓存.任何一个缓存的数据被更新后,由于其他处理器也可能要存取,共享内存就需要立即更新,否则,不同的处理器可能用到不同的数据. 在Linux系统中,共享内存允许一个进程或多个进程共享一个给定的存储区(共享内存).不同进程之间共享的内存通常安排为同一段物理地址.进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址

Oracle Share Pool内部管理机制

SHARE POOL利用堆(HEAP)的内存管理方式管理,在物理上由多个内存区(EXTENT)组成,内存区又由多个不同大小的CHUNK组成.而CHUNK又有可重用和空闲之分,并且它们分别有LRU LIST.FREE LIST.RESERVED LIST串联起来. 堆管理 Shared Pool是利用堆内存管理方式管理的(KGH:Kernel Generic Heap).从Oracle 9i开始,可以有多个最高级堆(TOP-LEVLE HEAP),最高级堆可以分成多个副堆,副堆下面还拥有子堆.堆和

vector存入共享内存(了解)

昨天在上篇blog里描写了如何把STL容器放到共享内存里去,不过由于好久不写blog,发觉词汇组织能力差了很多,不少想写的东西写的很零散,今天刚好翻看自己的书签,看到一篇挺老的文章,不过从共享内存到STL容器讲述得蛮全面,还提供了学习的实例,所以顺便翻译过来,并附上原文地址. 共享内存(shm)是当前主流UNIX系统中的一种IPC方法,它允许多个进程把同一块物理内存段(segment)映射(map)到它们的地址空间中去.既然内存段对于各自附着(attach)的进程是共享的,这些进程可以很方便的通

Windows上CAtlFileMapping共享内存的使用以及内部机制

前言: 使用CEF载入网页.做JS与C++交互时.须要向主窗体发送一些消息来通知界面做对应的处理.可是,因为CEF使用chrome内核是多进程架构的.渲染引擎与主程序都不在同一个进程里面.因此.理所当然的就想到了使用共享内存了.为了更easy地使用,我们选择的是ATL里面封装的共享内存操作类:CAtlFileMapping. CAtlFileMapping使用: 定义结构体,包括你所须要共享的数据,这里我们仅仅须要共享主窗体的句柄 //自己定义进程共享数据结构体 struct PROCESS_S

Oracle数据库共享内存分配不足问题的解决

问题: ORA-04031: unable to allocate 19204 bytes of shared memory ("shared pool","unknown object","sga heap(1,0)","session param values") 错误原因: 共享内存太小,分配给共享池的内存不足以满足用户请求,或者存在一定碎片,没有有 效的利用保留区,造成无法分配合适的共享区.一个ORACLE例程的系统全

linux内存管理之heap篇

文章来源——博客园绿色冰点 前几次我们分析了Linux系统中用户进程的4G虚存大致分为了几个部分,介绍了3G用户空间中数据段,代码段等静态区域的虚存管理,重点分析了栈的使用.这次我们来分析一下虚存使用中另一个重要部分--堆.前面的介绍中,我们知道编译器,操作系统担负着大量栈分配管理的工作.不论是静态分配的栈空间还是用户动态分配的栈空间,在函数返回的时候就自动释放了.堆的使用比之栈而言更为灵活,允许程序员动态的分配并释放,但也意味着,堆的使用需要程序员更为小心. 4.5 堆的内存管理 在学习"数据

共享内存通讯

1.核心理论 共享内存是IPC机制中的一种,它允许两个不相关的进程访问同一段内存,这是传递数据的一种非常有效的方式. 2.函数学习 创建/获取共享内存 函数名:shmget 函数原型:int shmget(key_t key,size_t size,int shmflg) 函数功能:创建或者获取共享内存,并返回其描述符 头文件:<sys/ipc.h> <sys/shm.h> 返回值:成功:返回创建或获取到的共享内存的描述符 失败:-1 参数说明:key:共享内存的键值 size:共