欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入 这几天一直都在寻找一本深入研究oracle内存的书籍,期间一波三折弄的自己神魂颠倒,但是还是被我拿下了,感谢支持我的朋友,这周打算把oracle的内存进行一下深入剖析,以此记录学习笔记。 一)内存体
欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入
这几天一直都在寻找一本深入研究oracle内存的书籍,期间一波三折弄的自己神魂颠倒,但是还是被我拿下了,感谢支持我的朋友,这周打算把oracle的内存进行一下深入剖析,以此记录学习笔记。
一)内存体系结构:
每当数据库的实例启动的时候oracle database就会分配内存以及后台进程,在内存区域中存储的如下相关信息:
》程序代码
》关于以及连接的会话信息,即使该会话不是活动状态。
》程序执行期间需要的相关信息
》关于数据共享一些锁的信息。
》缓冲的数据,想数据块和重做日志记录等等。
可以查一下上面这个图:
A)基本的内存结构包括如下部分:
1)sga(系统全局区,system global area)
sga有很多共享内存结构组成,叫做sga的组件,它包括一些关于实例的数据信息和控制信息,sga被所有的服务进程和后台进程所共享。例如数据存储在sga中包括缓存的数据块和共享sql区域。
2)pga(程序全局区,program global area)
pga是被一个oracle进程独自占有的不是共享的一块区域,它包含一些数据信息和控制信息。在oracle进程启动的时候该区域就被创建了。
pga是为每个服务进程和后台进程存在的,所有的服务进程和是后台进程 锁分配的所有pga成为实例pga大小。oracle只能对整个所有pga的大小进行限制,不能对单个进程的pga进行设置大小。
3)uga(用户全局区,user global area)
uga保存了一些用户的会话信息。
4) 软件代码区(software code areas)
该区域是存储一些执行的代码或是能够被执行的代码的区域。
B)oracle database 内存管理
内存管理就是可以根据数据库的不断变化能够维护oracle内存的相关结构大小,并且给予内存的相关components一个合理的值。oracle内存的管理是通过设置相关参数文件中的参数进行设定的。其中包括如下管理方式:
1)自动内存管理(automatic memory management)
dba可以指定一个总的目标内存值,然后数据库实例就会自动的对内存的相关组件按照不同的需求进行自动动态调整内存大小,也就是安装不同内存的需求动态的调整pga和sga的相关大小。(该内容在后续进行深入研究)
2)自动共享内存管理((automatic shared memory management)
该管理模式是对内存的一个部分自动管理。你可以给sga设置一个总的大小目标值然后再设置一个总的pga大小内存值进行管理。
3)手动内存管理(manual memory management)
手动内存管理就不是设置一个目标最大值了,而是通过参数文件中的相关参数进行每个内存组件的手动管理。(该方式繁琐,被弃用了)
note:在11g中,如果在创建数据库的时候使用dbca然后选择基本按照方式的时候,默认是采用了自动内存管理。
pga是在操作系统的进程或是线程特定的一块内存区域,它不是共享的。因为pga是进程指定的,因此它不会在sga中分配。
pga是一个内存堆,其中包含了被专用服务器或是共享服务器金曾锁需要的一些会话变量信息。服务器进程需要在pga中分配一些所需的内存结构。
一个比喻为,pga是一个临时的文件管理员的工作区域,这个文件管理员就是服务进程,她是为客户服务工作的(client process),然后文件管理员把工作区域分为很多的区域,然后来处理或是保存客户的不同信息,当这个工作完成的时候,那么相关区域的空间就会被释放掉。
如下图,显示了在专用服务器模式下所有的进程分配的pga的信息(注意background 进程也是需要分配pga的),可以使用一个初始化参数设置一个大的instance pga 值,然后每个私有的pga分别占用instance pga的一部分size:
[1] [2] [3] [4] [5] [6]