PGA内存空间的分配与回收
一、UGA由哪几部分组成?
由上述图片可知,
一个会话里如果处理的是SQL语句,那么在shared pool中就有该SQL语句对应的Shared Areas,该Shared Areas的类型为Shared SQL Areas,在该会话对应的进程对应的uga中,就有该SQL语句对应的Private Areas,该Private Areas的类型为PrivateSQL Areas。当然由于当一个SQL语句执行完毕后它对应的PrivateSQL Area也会释放掉,又一个会话里同时只有一个SQL语句执行,所以该会话对应的进程对应的uga中始终最多只有一个Private SQL Area存在。
一个会话里如果处理的是 PL/SQL programunits,那么在shared pool中就有该 PL/SQL program units对应的Shared Areas,该Shared Areas的类型为SharedPL/SQL Areas,在该会话对应的进程对应的uga中,就有该SQL语句对应的Private Areas,该Private Areas的类型为PrivatePL/SQL Areas。当然由于当一个PL/SQL program units执行完毕后它对应的Private SQL Area也会释放掉,又一个会话里同时只有一个PL/SQL program units执行,所以该会话对应的进程对应的uga中始终最多只有一个Private PL/SQLAreas存在。
由此可知,uga里必然包括session memory,而private sqlarea这个部分是当有SQL语句运行时存在于uga里,PrivatePL/SQL Area也是如此。
如果oracle还安装了OLAP组件,那么uga里也必有theOLAP pool。
uga组成部分结论的得出过程:
Pga和uga分别包含哪些部分?
当uga处于pga中(专用服务器模式)时,两者的分别包含哪些部分是否很清楚:uga全部处于pga中,uga包括session memory(记录会话信息)和私有sql区(包括the persistent area和 the runtime area(包括sql工作区和query execution stateinformation(即记录SQL语句执行进度的部分)两部分)两部分)。
当uga处于sga中(共享服务器模式)时,两者的分别包含哪些部分分别可理解为以下三种说法:
首先说明的是,按照oracle11gR2官方文档里的图示(http://docs.oracle.com/cd/E11882_01/server.112/e40540/memory.htm#i14490),sql工作区不包含在私有sql区的,uga就是图示中的session memory。按照oracle10g官方文档的说法,sql工作区是包含在私有sql区的。
Memory Area |
Dedicated Server |
Shared Server |
Nature of session memory |
Private |
Shared |
Location of the persistent area |
PGA |
SGA |
Location of part of the run-time area for |
PGA |
PGA |
Location of the run-time area for DML/DDL statements |
PGA |
PGA |
再参考上述来自oracle11gR2官方文档里的表格(http://docs.oracle.com/cd/B19306_01/server.102/b14220/memory.htm#i14490),可理解出三种说法。
第一种,uga就是图示中的session memory,uga处于sga中,而thepersistent area也处于sga中,那么the persistent area还是pga的一部分吗?还是说
第二种,上述表格中处于sga里的都是uga的组成部分。
第三种,uga包括session memory和private sql area两部分,当uga对应的进程是共享服务器进程时,那么uga分成两块,分别放在pga和sga上。
个人倾向认同第三种。
oracle10gR2官方文档对Library Cache解释:
LibraryCache
从上面的表格可以看出,这里说的共享服务器模式时共享服务器进程的private SQL areas应该是部分在Library Cache上。
0、PGA上内存空间的分配与回收的过程可能会引起ora-4030。发生ora-4030,是可能因为操作系统的内存耗尽没有多余可以再分配了。
1、Pga中uga占了大头,uga中sql工作区又占了大头。
2、自动管理pga实际上调整的就是SQL工作区域(SQL Work Area)。
3、从V$PROCESS_MEMORY中字段CATEGORY
上可以看出
pga上内存空间分别用于什么用途,即pga上内存空间可以分成包括Freeable在内的六种类型。
正文
1、
从上面可得出如下结论:
无论是手动管理pga(的内存分配回收),还是自动管理pga(的内存分配回收),假设当一个进程产生时它对应的pga分配的空间大小为A,使用的空间大小为B,则当该进程运行一SQL语句时,要用到sql工作区,故而此时pga分配的空间大小和使用的空间大小就要变大,即pga分配的空间大小变为C,使用的空间大小变为D。
而当该SQL语句执行完毕后,就会释放sql工作区。此时,在手动管理pga(的内存分配回收)模式下,sql工作区所释放的空间就会释放给pga,故pga分配的空间大小依然为C,使用的空间大小变为B。在自动管理pga(的内存分配回收)模式下,sql工作区所释放的空间就会释放给操作系统,故pga分配的空间大小变为A,使用的空间大小变为B。
在手动管理pga(的内存分配回收)模式下,uga(包括其中的sql工作区)和cga所需的内存分配是从原本已有分配的pga上分配,如果原来操作系统给该pga分配的内存空间中不能分配出uga(包括其中的sql工作区)和cga所需的内存空间,则pga会先向操作系统申请内存分配给自己,再之后分配给uga(包括其中的sql工作区)和cga所需的内存。所以,释放的sql工作区所占的内存空间回收给pga,故而会产生pga内存空间可能一直增大的情况。
在自动管理pga(的内存分配回收)模式下,uga(包括其中的sql工作区)和cga所需的内存分配是直接从操作系统上分配,而不是从原本已有分配的pga上分配的,所以,释放的sql工作区所占的内存空间回收给操作系统,故而不会产生pga内存空间可能一直增大的情况,而有增有减。当然,这些从操作系统上分配的uga(包括其中的sql工作区)和cga的内存空间加上原本已有分配的pga内存空间,就成为该pga内存空间的新值,从V$PROCESS上的字段 PGA_ALLOC_MEM(或是PGA_USED_MEM)有增减变化这一现象或是从V$PROCESS_MEMORY上字段 CATEGORY 比如为SQL时 字段ALLOCATED(或是USED)有增减变化这一现象可以看出。
2、一个进程在视图V$PROCESS_MEMORY上各个字段CATEGORY值对应的ALLOCATED值之和,等于该进程在视图V$PROCESS上字段PGA_ALLOC_MEM值。同理,一个进程在视图V$PROCESS_MEMORY上各个字段CATEGORY值对应的USED值之和,等于该进程在视图V$PROCESS上字段PGA_USED_MEM值。
一个进程在视图V$PROCESS_MEMORY上字段CATEGORY值为Freeable对应的ALLOCATED值,等于该进程在视图V$PROCESS上字段PGA_FREEABLE_MEM
值。
刚开始以为视图V$PROCESS 中PGA_ALLOC_MEM字段减去 PGA_USED_MEM 字段 所得的差值就是等于PGA_FREEABLE_MEM
字段的值。但是实际上,发现不是这样,看到自己电脑上的显示的
V$PROCESS结果里,PGA_FREEABLE_MEM
字段的值都是为0,而
PGA_ALLOC_MEM字段减去 PGA_USED_MEM 字段 所得的差值都不是0。因为内存空间的分配和使用这两个概念是软件设计中常用的管理内存空间的手段。例如,创建一个表时,会分配以一个区段大小为单位的整数倍的空间给该表,而当向表中添加数据时(也就是使用该表时),则是按一个oracle数据块的空间大小为单位来使用,即按数据块大小来添加数据的。再如,window下用的记事本文件都是先分配一定大小(假设为A)的空间,如果使用该记事本文件的大小超过了该分配的空间,则又会再分配一定大小(也为A)的空间给该记事本文件。如下图所示:
图示里大小:69字节表示该记事本文件已经使用了的空间大小,而占用空间:4096字节则表示操作系统给该记事本文件分配的空间大小。
那么视图V$PROCESS 中的PGA_FREEABLE_MEM
字段表示什么呢?
我们可以从对
V$PROCESS_MEMORY中字段CATEGORY
的解释中得知:
Category name. Categoriesinclude "SQL", "PL/SQL", "OLAP" and"JAVA". Special categories are "Freeable" and"Other". Freeable memory has been allocated to theprocess by the operating system, but has not been allocated to a category."Other" memory has been allocated to a category, but not to one ofthe named categories.
从上面的解释中可以发现,pga上内存空间可以分成包括Freeable在内的六种类型。比如,会话执行sql语句时pga上就会有一块SQL类型的区域,执行PL/SQL存储过程时pga上就会有一块PL/SQL类型的区域。包括Freeable在内的每一个CATEGORY
都有自己的ALLOCATED和USED属性。只是还不知道在什么情况下一个进程对应的pga里的
Freeable是不为0。因为在V$PROCESS_MEMORY中CATEGORY
例如为SQL,假如一个sql工作区释放时,则其对应的ALLOCATED和USED属性值也会下降,但是这些释放的空间似乎不是放到CATEGORY为
Freeable的这里,它对应的ALLOCATED和USED属性值还是为0.
在手动管理pga(的内存分配回收)模式(即_use_realfree_heap=true时)下,例如SQL工作区的内存空间回收给了pga(里的uga,专用服务器模式时),则那么该回收的空间会给Freeable的这里吗?
视图V$PGASTAT 上的字段total freeable PGA memory的值等于数据库当前各个进程在视图V$PROCESS上字段PGA_FREEABLE_MEM
值之和。
PGA memory freed back to OS字段值是字段totalfreeable PGA memory的值的累计值。(?)
注释:
1、pga内存主要用于排序(当一个SQL语句中有排序操作时)等操作,因为pga内存的大部分空间为SQL工作区所占。
2、pga中不是有CGA是用于例如分析调用、提取调用等(暂时存放的结果集)吗?那么一个没有带有排序等操作的SQL语句执行时,是否会把结果集先存放在CGA中?可以通过如下方法验证:
在运行一个没有带有排序等操作的SQL语句期间,查看v$process的use字段是否变大,或是查看v$process_memory的cartory字段为other时对应的use字段是否变大?
PGA内存空间的分配与回收相关推荐
- UGA由哪几部分组成和PGA上内存空间的分配与回收的方式
一.UGA由哪几部分组成? 由上述图片可知, 一个会话里如果处理的是SQL语句,那么在shared pool中就有该SQL语句对应的Shared Areas,该Shared Areas的类型为Sh ...
- 六、操作系统——内存管理的概念(空间的分配与回收、空间的扩充、地址转换、存储保护)
一.概述 二.操作系统作为系统资源的管理者,当然也需要对内存进行管理,要管些什么呢? 1. 内存空间的分配与回收 连续分配:指为用户进程分配的必须是一个连续的内存空间. 1. 单一连续分配 在单一连续 ...
- 实验四、主存空间的分配和回收模拟
实验四.主存空间的分配和回收模 物联网工程 王鸾 201306104128 一. 实验目的 为了合理地分配和使用这些存储空间,当用户提出申请主存储器空间时,存储管理必须 ...
- 《操作系统》实验报告——主存空间的分配与回收
理论知识 Linux--Linux C语言编程基础知识 一.实验目的 采用可变式分区管理,使用最佳适应算法实现主存的分配与回收. 通过本次实验,帮助学生理解在可变式分区管理方式下,如何实现主存空间的分 ...
- 操作系统——实验叁——主存空间的分配与回收
一. 实验目的 采用可变式分区管理,使用最佳适应算法实现主存的分配与回收 通过本次实验,帮助学生理解在可变式分区管理方式下,如何实现主存空间的分配与回收. 二. 实验内容 主存是中央处理机能直接存取指 ...
- 操作系统实验三:主存空间的分配与回收
实验三:主存空间的分配与回收 一.实验目的 通过本次实验,帮助学生理解在可变式分区管理方式下,如何实现主存空间的分配与回收. 二.实验内容 主存是中央处理机能直接存取指令和数据的存储器.能否合理而有效 ...
- 【操作系统】主存空间的分配和回收
实验一.主存空间的分配和回收实验 专业:商业软件工程 姓名:杨晶晶 学号:201406114102 一. 实验目的 用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方 ...
- 用循环首次适应算法、最佳适应算法和最坏适应算法,模拟可变分区存储管理,实现对内存区的分配和回收管理
湖南师范大学 信息科学与工程学院 操作系统课程实验报告 实验项目名称: 可变分区存储管理 题目 实验一.可变分区存储管理 一.实验目的: 加深对可变分区存储管理的理解: 提高用C语言编制大型系统程序的 ...
- 采用空白文件目录结构管理磁盘空间,实现磁盘空间的分配和回收
实验题目:采用空白文件目录结构管理磁盘空间,实现磁盘空间的分配和回收 #include"stdio.h" #include"math.h" #define N ...
最新文章
- 广州成立大数据产业协同创新联盟
- 数据结构: 线索化二叉树
- SQL 四种连接:内连接、左外连接、右外连接、全连接--转载
- batch normalization的原理和作用_springboot自动配置原理
- ABAP正则表达式 vs SPLIT INTO 1
- jzoj4244-yi【贪心】
- unity3d 捕获系统日志,来处理一些问题
- Python+sklearn使用朴素贝叶斯算法识别中文垃圾邮件
- Excel 连接 MySQL 导入数据 自定义 SQL (Excel 2016 + 适用)
- expect+shell脚本实现免密登录
- 【Pix4d精品教程】Pix4d项目空三结果精度评估完整解决方案(建议收藏)
- windows系统TLQ8安装时提示载入java vm时windows出现错误
- 计算机课教师评价,教师课堂评价语集锦
- HttpClient 4.1版本,模拟登录,终于成功了(2)
- NOIP2015 口胡题解
- 002_Python基础学习网站
- 七夕表白之Python画玫瑰花
- C语言中格式化字符串
- FFmpeg入门详解之117:视频监控的架构和流程
- 随手记录第二话 -- 高并发情况下秒杀、抢红包都有哪些实现方式?
热门文章
- 【电路分析】拉普拉斯变换及其应用
- UCLA计算机录取案例,UCLA的Computer Science「加州大学洛杉矶分校计算机科学系」
- 智慧公路引领时代变革?
- HTML网页悬浮按钮
- 学生用ChatGPT拿下全班最高分!教授惊呆!全美高校打响AI反击战...
- Google新作synthesizer:Rethinking Self-Attention in Transformer Models
- .Net Web开发技术栈 收藏
- 刘汝佳 例题7-1 除法(暴力解法)
- 05. 微信公众号消息加解密
- G120变频器本地_远程切换(CDS切换)的具体方法和步骤