O-理解共享池
我们可以通过show sga命令查看共享池的整体组成部分:
....待截图....
一、SGA内存结构
Oracle中SGA主要包括:
1、固定数据结构部分(FIXED Size) 2、数据块缓冲区(DATABASE BUFFER) 3、REDO LOG缓冲区(redo buffers) 4、共享池(在variable size中)。
固定区域包含了所有其他共享内存结构和重要的数据结构的地址和指针、资源、锁等,可通过如下命令详细列出具体内容:
select pool,name,bytes from v$segstat where pool = 'shared pool';
顾名思义,共享池是为了让大家共享数据而设置的缓冲池,而且共享池也是很多会话为自己执行SQL分配共享内存的缓冲池,这些在共享池中分配的内存在会话之间使用十分频繁,应实现一次分配多次使用,并且能被实例中其他会话共享。
二、SGA内存分配
DB CACHE可以根据数据块大小很规则的均匀分配,因此不会出现碎片问题,而且DB CACHE分配与归还相对简单。但与DB CACHE不同,由于各个会话在共享池中分配空间的时候所需要的空间差异很大,有时几十字节,有时几百字节甚至几兆,因此共享池的分配归还十分复杂。为了确保共享池中共享数据的访问性能,共享池的每次内存分配都必须是连续的内存空间,由于这个特点,经过一段时间后,共享池中或多或少都会出现一些碎片,这些碎片分布在一些连续分配的空间之间。
共享池中分配的内存空间有些事永久使用,不释放的并标记为PERMANENT,这些结构大多是在实例启动时分配的,也有些是系统运行过程中分配的,但这些内存的特点是只分配,在实例关闭前不会释放,例如:进程信息数据,会话数据,特殊内容的进程段。进程和会话信息是通过PROCESSES和session参数分配的,实例启动时一次性分配,分配后不变动,也不会动态扩展,因此加大processes参数必须要重启实例,另外有些特殊用途的内存数组也是在实例启动时分配,是动态扩展的,只分配不释放,在后续可动态扩展,例如:enqueues(locks),enqueue resource,transactions,transaction branches等,对于RAC还有gcs resource,ges resource等。如果这些动态扩展动作经常发生,将会在共享池的连续空间中产生大量的不可释放的小碎片,从而导致共享池碎片化。(典型案例:9i中经常由于ges resource扩展导致共享碎片问题,并产生4031错误。10.2版对此进行了改进,详细理解请百度)
共享池中还有些是分配后可释放的,这些内存被标记为freeable或者recreateable。freeable是可以直接释放,recreateable的内存在unpin后也是可以释放的,因此他们都是可以重用的内存。
二、共享池管理
共享池内存是通过ORACLE通用内存管理(generic oracle memory manager)来进行管理的,这个就是我们总说的KGH heap manager。在KGH机制下,所有共享池的FREE内存都被挂在称为freelists的空闲链表上,这个空闲链表是按照bucket机制建立的,根据空闲内存片段大小,挂在不同的Bucket上,例如:9i的共享池的freelists包含256个bucket,每个bucket上连接了不同大小的空闲内存块
*小于812B的Bucket是以4B为步长增长的,如16B,20B,24B.....812B;
*超过812B的bucket是以64B为步长增长的,如876B,940B,....4012B;
*超过4012B的bucket是以4096的倍数倍增的,如4108,8042,16396,32784,.....
当某个会话需要从共享池中分配空间的时候,会根据自己分配的大小找到某个bucket,然后找到一个空闲的内存,从中产生的剩余内存,会被挂到相应的bucket上,供其他会话分配使用,而被释放的内存会被挂到freelists上,为了不碎片化,被释放的内存自动合并,如果两个内存片段相邻,ORACLE会将他们合并为一起。
共享池大小通过shared_pool_size参数定义,自动内存管理模式不用设置此参数,如果设置了此参数那么共享池会根据这个参数作为初始大小和最小值,无论内存如何调整,共享池大小都不能小于这个参数。
三、共享池内部结构(堆) /*此处很难待续...关注<DBA思想的天空>64页*/
ORACLE内存空间分配时采用堆管理(HEAP)的模式,堆管理的基础是KGH。ORACLE常见的内存堆包括SGA HEAP,PGA HEAP,另外大部分表也是堆表(HEAP TABLE),其空间管理的基本概念都是使用KGH。
四、共享池转储文件简单说明
转储文件有几百兆深圳几个G,共享池的内容转储到文件的基本命令,用如下命令可以把LIBRARY_CACHE的内容转储到TRACE文件中:
ALTER SESSION SET EVENTS 'immediate trace name LIBRARY_CACHE level <level>';
其中level代表级别,9.2版本后不同level含义如下
* level=1 转储库缓存统计信息
* level=2 转储散列表概要
* level=4 转储库缓存对象,只包含基本信息
* level=8 转储库缓存对象,包含详细信息(包括child reference,pin waiters等)
* level=16 增加堆大小信息
* level=32 增加堆信息
O-理解共享池的更多相关文章
- 深入理解shared pool共享池之library cache的library cache lock系列四
本文了解下等待事件library cache lock,进一步理解library cache,之前的文章请见: 深入理解shared pool共享池之library cache的library ca ...
- 深入理解shared pool共享池之library cache系列二
背景 继续上文:深入理解shared pool共享池之library cache系列一,学习library cache数据结构,本文主要学习library cache object(lco)的数据结构 ...
- [20180813]刷新共享池与父子游标.txt
[20180813]刷新共享池与父子游标.txt --//测试刷新共享池与父子游标含有那些信息保存在共享池.--//自己最近遇到的问题,感觉自己以前理解有点乱,测试看看. 1.环境SCOTT@book ...
- 温故知新-java多线程&深入理解线程池
文章目录 摘要 java中的线程 java中的线程池 线程池技术 线程池的实现原理 简述 ThreadPoolExecutor是如何运行的? 线程池运行的状态和线程数量 任务执行机制 队列缓存 Wor ...
- ORACLE从共享池删除指定SQL的执行计划
Oracle 11g在DBMS_SHARED_POOL包中引入了一个名为PURGE的新存储过程,用于从对象库缓存中刷新特定对象,例如游标,包,序列,触发器等.也就是说可以删除.清理特定SQL的执行计划 ...
- oracle 共享池( shared pool )
Oracle共享池 Oracle共享池(Share Pool)属于SGA,由库高速缓存(library cache)和数据字典高速缓存(data dictionary cache)组成. 库高速缓存 ...
- 将指定SQL的执行计划从共享池删除的方法
如果Oracle的优化器产生了某种错误的执行计划,或者我们希望Oracle对于某个SQL重新进行分析,那么就需要这个SQL的执行计划在共享池中过期,而简单的方法在10.2.0.4以后才出现. 对于 ...
- Java提高班(二)深入理解线程池ThreadPool
本文你将获得以下信息: 线程池源码解读 线程池执行流程分析 带返回值的线程池实现 延迟线程池实现 为了方便读者理解,本文会由浅入深,先从线程池的使用开始再延伸到源码解读和源码分析等高级内容,读者可根据 ...
- 使用DBMS_SHARED_POOL包将对象固定到共享池
使用DBMS_SHARED_POOL包将对象固定到共享池2011年06月24日 09:45:00 Leshami 阅读数:5808 版权声明:本文为博主原创文章,欢迎扩散,扩散请务必注明出处. htt ...
随机推荐
- SiteMesh2-示例工程
了解SiteMesh的最佳方法是使用它.假设SiteMesh设置在您的Web应用程序中,本教程将展示如何掌握SiteMesh最强大的方面,如下所示装饰页面: 效果发生在第2步,其中Menu.jsp页面 ...
- ubuntu Shell
Ubuntu下的ShellUbuntu的图形界面也是运行在Shell下的:虚拟终端机开启:Ctrl+Alt+F1~ F6 可以开启6个命令行的ShellCtrl+Alt+F7 开启图形终端机命令su ...
- 如何使用IVT BlueSoleil 如何在电脑上使用蓝牙耳机
1 确保电脑上有蓝牙适配器 (现在很多电脑是不配蓝牙的),如果没有,网上买个蓝牙适配去,十几块钱很便宜.好了之后装一个下面这个软件,然后搜索蓝牙耳机,下面的状态栏就是"搜索设备" ...
- 【bzoj3105】【cqoi2013】【新Nim游戏】【线性基+贪心】
Description 传统的Nim游戏是这种:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量能够不同).两个游戏者轮流操作,每次能够选一个火柴堆拿走若干根火柴.能够仅仅拿一根,也能够拿走整堆火柴 ...
- 开发汉澳sinox64位,对接汉澳矩阵电脑
汉澳矩阵电脑刚刚不久前提出,即使全然设计出了汉澳矩阵电脑线路图,要在上面执行操作系统必须有矩阵操作系统. 汉澳sinox64位操作系统并非矩阵操作系统,仅仅是更为接近. 汉澳矩阵电脑假设插有16个矩阵 ...
- 数据库学习之简单的SQL语句
1.数据库的结构 1.1数据库 不同数据库叫做Catalog(在有的 DBMS 中也称为 Database,即数据库) .採用多 Catalog 以后能够给我们带 来例如以下优点: 便于对各个 Cat ...
- 设计模式(一)单例模式:创建模式 ASPNET CORE WEB 应用程序的启动 当项目中 没有STARTUP.CS 类如何设置启动 配置等等
设计模式(一)单例模式:创建模式 先聊一下关于设计的几个原则(1)单一原则(SRP):一个类应该仅有一个引起它变化的原因 :意思就是 (一个类,最好只负责一件事情,并且只有一个引起它变化的原因(2)开 ...
- python多线程实现抓取网页
Python实现抓取网页 以下的Python抓取网页的程序比較0基础.仅仅能抓取第一页的url所属的页面,仅仅要预定URL足够多.保证你抓取的网页是无限级别的哈,以下是代码: ##coding:utf ...
- Hadoop生态系统学习路线
主要介绍Hadoop家族产品,经常使用的项目包含Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, Chukwa.新添加 ...
- Android---58---初学GPS定位
GPS英文是Global Positioning System 全球定位系统的简称. Android为GPS功能支持专门提供了一个LocationManager,位置管理器.全部GPS定位相关的服务. ...