(Les01 Architecture II 内存结构)[20180110]

Oracle数据库内存结构

Oracle数据库创建和使用内存结构有多样的目的,如存储运行的程序块、共享使用的数据和用户连接的私有数据 。

内存结构主要有两部分:

-System Global Area(SGA) 系统全局区:包含Oracle数据库实例的数据和控制信息。

                      SGA被服务器和后台进程所共享。

                      SGA中存储的数据有高速缓存的数据块和共享SQL区域等等。

-Program Global Area(PGA)程序全局区:包含服务器或后台进程的数据和控制信息的内存区域。

                      PGA是在启动服务器或后台进程时由Oracle数据库创建的非共享内存。

                      每个服务器进程和后台进程都有自己的PGA。

System Global Area(SGA)所包含的组件

-Shared pool共享池:缓存用户之间的各种组织

-Database buffer cache数据库高速缓冲区:缓存数据库检索的数据块

-Keep buffer cache保留缓冲区:一种特殊的高速缓冲区,用于长时间保留在内存中的数据块

-Recycle buffer cache回收缓冲区:用于快速从缓冲区删除或回收数据块

-nK buffer cache指定块大小缓冲区:用于保存不同于默认的数据库块大小的高速缓冲区。2K,4K,8K,16K,32K

-Large pool大池:为某些大型进程(如Oracle备份、恢复和并行)提供大内存分配的可选区域

-Redo log buffer重做日志缓冲区:用于将内存中的脏数据写入到磁盘上的物理重做日志文件

-Streams pool流池:用于存储Oracle流捕获和应用信息

-Java pool java池:用于特定的java代码和java虚拟机(JVM)的数据

动态SGA中可以对database buffer cache、shared pool、larger pool、java pool和streams pool动态调整并且不用关闭实例。

Program Global Area(PGA)程序全局区

-Stack space 栈空间

-User global area(UGA) 用户全局区

数据库初始化参数memory_target和memory_max_target设定一个目标内存大小,数据库自动管理和调优sga和pga。

SHARE POOL(共享池)

参数:shared_pool_size

-Library cache库高速缓存:

-Shared SQL area共享SQL区域:包含SQL语句语法分析树和执行计划。

-Data dictionary cache数据字典缓存:也称为行高速缓存,它以行的形式存放数据,而不是以缓冲区的形式存放数据(缓冲区用于存放完整的数据块)

-Control structure控制结构

-Fixed Area固定区域:表示SGA的启动开销,它非常小

Shared Pool

->Library Cache(SQL、PL/SQL、control structure-lock/library cache handles) soft parse/library cache hit. hard parse/library cache miss

->Shared SQL Area(语句解析树、执行计划)

->Private SQL Area

  数据库执行步骤:

   1.检查共享池,查看共享SQL区是否已存在语法和语义相同的语句。

   如果存在相同的语句,数据库使用共享SQL区的指令,从而减少内存消耗的执行。

    如果不存在相同的语句,则数据库分配共享SQL存放此语句。相同的语法,但不同的语义的语句使用子游标。

   2.分配一个私有SQL区给会话

    私有SQL区的位置取决于会话建立的连接。如果会话是通过共享服务器连接,则该私有SQL区的一部分存放在SGA。

   Process Client->Server Process[PGA]->[SGA[Shared Pool[Library Cache[Shared SQL Area]]]]

->Data Dictionary Cache

->Server Result Cache

->Reserved Pool

查询Shard pool大小

            select sum(bytes)/1024/1024 mb from v$sgastat where pool=‘shared pool‘;
            select POOL, NAME, BYTES, BYTES/1048576 as MBytes from v$sgastat where pool=‘shared pool‘ order by BYTES desc;

可以通过x$ksmsp(KSMSP是Kernel  Service layer Memory management Sga heaP的缩写)表来详细观察共享池的详细情况。这个表显示了空闲的内存,可以释放的内存,以及为当前共享池容纳不下的大型语句所保留的内存,每一行代表共享池中的一块内存。

SELECT KSMCHCLS CLASS, COUNT(KSMCHCLS) NUM, SUM(KSMCHSIZ)
            SIZ,
            To_char( ((SUM(KSMCHSIZ)/COUNT(KSMCHCLS)/1024)),‘999,999.00‘)||‘k‘ "AVG SIZE"
            FROM X$KSMSP GROUP BY KSMCHCLS;

              x$ksmsp表中的列含义如下:
                addr:该行在固定表的数组中的地址
                indx:该行在固定表的数组中的索引号码
                inst_id:oracle实例编号
                ksmchcom:分配的内存块的描述
                ksmchsiz:这块分配的共享池内存块的大小
                ksmchptr:这块分配的内存块的物理地址
                ksmchcls:这块分配的共享池内存块的类型

 ksmchcls 主要有四类,说明如下:
       free Free chunks--不包含任何对象的chunk,可以不受限制的被分配.
       recr Recreatable chunks--包含可以被临时移出内存的对象,在需要的时候,这个对象可以 被重新创建.例如,许多存储共享sql代码的内存都是可以重建的.
       freeabl Freeable chunks--包含session周期或调用的对象,随后可以被释放.这部分内存有时候 可以全部或部分提前释放.但是注意,由于某些对象是中间过程产生的,这些对象不能 临时被移出内存(因为不可重建).
       perm Permanent memory chunks--包含永久对象.通常不能独立释放.   我们可以通过查询x$ksmsp视图来考察shared pool中存在的内存片的数量 不过注意:Oracle的某些版本(如:10.1.0.2)在某些平台上(如:HP-UX PA-RISC 64-bit)查 询该视图可能导致过度的CPU耗用,这是由于bug引起的.  

查看共享内存整体的统计

    select * from V$LIBRARY_CACHE_MEMORY;

v$sga_resize_ops记录已完成的近期850次SGA组件重定义大小的操作,注意是已经完成

v$sga_current_resize_ops它仅记录当前正在操作中的SGA组件重定义操作,注意是正在操作中的

 SELECT start_time,
       component,
       oper_type,
       oper_mode,
       initial_size / 1024 / 1024 "INITIAL",
       final_size / 1024 / 1024   "FINAL",
       end_time
FROM   v$sga_resize_ops
WHERE  component IN ( ‘DEFAULT buffer cache‘, ‘shared pool‘ )
       AND status = ‘COMPLETE‘
ORDER  BY start_time,
          component;
 

DATABASE BUFFER CACHE(数据库缓冲区高速缓存)

参数:db_cache_size

-存放从数据文件读取的数据块的副本

-由所有并行用户共享

用于存放从数据文件中读取的块镜像或动态构造的块镜像,以便符合读一致性模型要求。并行连接到实例的所有用户共享对数据库缓冲区高速缓存的访问。

Oracle DB用户进程第一次请求特定的数据块时,将在数据库缓冲区高速缓存中搜索数据。如果该进程在数据库缓冲区高速缓存中找到数据(称为高速缓存命中),则直接从内存中读取数据。如果进程在高速缓存中找不到数据(称为高速缓存未命中),则在访问数据之前,必须将磁盘上的数据文件中的数据块复制到高速缓存中的缓冲区中。

高速缓存中的缓冲区由一个复杂算法管理,该算法组合使用最近最少使用(LRU:Lasst Recently Used"最近最少使用的页面置换算法")列表和停靠计数。LRU有助于确保最近使用的块往往都留在内存中,从而最大限度地减少磁盘访问。

KEEP BUFFER CACHE和RECYCLE BUFFER CACHE用于优化专用缓冲区池。

参数:db_keep_cache_size&db_recycle_cache_size

keep buffer cache用于延长缓冲区在内存中的保留时间,使其比使用LRU时的正常保留时间长。

recycle buffer cache用于加快内存中的缓冲区的刷新速度,使其比使用LRU是的正常刷新速度快。

nK buffer cache用于配置更多缓冲区高速缓存,以用于存放大小与默认块大小不同的数据块。

REDO LOG BUFFER(重做日志缓冲区)

参数:log_buffer(不能动态调整)

-存放有关对数据库所做更改的信息

-包含重做条目,这些条目包含对DML和DDL等操作所做的更改的重做信息。需要时,将使用重做条目进行数据库恢复。

服务器进程更改缓冲区高速缓存时,将会生成重做条目,并将其写入SGA中的重做日志缓冲区。重做条目占用缓冲区中连续的顺序空间。日志写进程后台会将重做日志缓冲区写入磁盘上的活动重做日志文件(或文件组)中。

LARGE POOL(大池)

参数:large_pool_size

-包含组件

I/O buffer(I/O缓冲区)、Free memory(空闲空间)、Parallel Query(并行查询)、Response queue(响应队列)、Request queue(请求队列)、Advanced Queuing(高级排列)

-共享服务器和Oracle XA接口(在事务处理与多个数据库交互时使用)的会话内存。

-I/O服务器进程

-Oracle DB备份和还原操作

-并行查询操作

-高级队列内存表存储

通过从large pool大池中为共享服务器、Oracle XA和并行查询分配会话内存,Oracle DB主要使用shared pool共享池来共享SQL,并避免由于收缩共享SQL高速缓存而导致的性能开销。

Oracle DB备份和还原操作、I/O服务器进程和并行查询的内存空间需要以百KB的缓冲区进行分配,与shared pool共享池相比,large pool大池可以更好地满足此类大型内存请求。

large pool大池不是有最近最少使用(LRU)列表管理的。

JAVA POOL(Java池)

参数:java_pool_size

-java池内存用于存储JVM中所有特定于会话的java代码和数据

STREAMS POOL(流池)

参数:streams_pool_size

-流池由oracle streams独占使用,流池存储缓冲的队列消息,并且为oracle streams捕获进程和应用进程提供内存。

PROGRAM GLOBAL AREA(PGA)程序全局区

程序全局区(PGA)是一个专用内存区,其中包含服务器进程的数据及控制信息。每个服务器进程都有独立的PGA。PGA只能由相应的服务器进程访问,并且只有代表该服务器进程的Oracle代码可以读取它。

每个PGA都包含堆栈空间。在专用服务器环境中,连接到数据库实例的每个用户都有单独的服务器进程。对于这种类型的连接,PGA包含一个用户全局区(UGA)的内存:

PGA:堆栈空间和用户全局区(UGA)

UGA:

-Cursor area 游标区,用于存储游标运行时的信息

-User session 用户会话数据存储区,用于存储有关会话的控制信息

-SQL working SQL工作区,用于处理SQL语句,包括以下

-sort area 排序区,用于对数据排序的函数,如order by he group by

-hash area 散列区,用于执行表的散列连接

-create bitmap area 位图创建区,用于创建数据仓库常用的位图索引

-merge bitmap area 位图合并区,用于解析位图索引计划的执行

在共享服务器环境中,多个客户端用户共享服务器进程。在这种模式下,UGA将移入SGA(共享池shared pool,也可能是大池 large pool),PGA仅包含堆栈空间。

参考:

https://docs.oracle.com/cd/B28359_01/server.111/b28318/memory.htm#CNCPT007

原文地址:https://www.cnblogs.com/also-brook/p/8287500.html

时间: 2024-10-28 18:58:21

(Les01 Architecture II 内存结构)[20180110]的相关文章

JVM内存结构

一.JVM内存结构 1.1 下面总体说说内存 Java虚拟机会将内存分为几个不同的管理区,这些区域各自有各自的用途,根据不同的特点,承担不同的任务以及在垃圾回收时运用不同的算法.总体分为下面几个部分: 程序计数器(Program Counter Register).JVM虚拟机栈(JVM Stacks).本地方法栈(Native Method Stacks).堆(Heap).方法区(Method Area) 1.2 下面说说具体各个结构的功能 1.2.1.程序计数器(Program Counte

多继承(虚继承)派生类对象内存结构

在这里谈一下虚继承.前面写过派生类对象的内存结构,都是基于VS2010编译器的,不同的编译器对于继承的处理不同,但本质都是一样的. 虚继承是解决共享基类问题的.例如在菱形继承中 如果不使用虚继承,基类A在D中会有两个,这不仅浪费内存,还会造成歧义.使用虚继承就可以解决基类共享的问题. 要想在派生类中共享基类(例如在D对象中只有一个A对象,这时候D对象中的B对象和C对象都可以查找到A,而不是在B对象和C对象中各含有一个A对象). 先看下面一个例子: #include<iostream> usin

oracle内存结构

一.内存结构 SGA(System Global Area):由所有服务进程和后台进程共享: PGA(Program Global Area):由每个服务进程.后台进程专有:每个进程都有一个PGA. 二.SGA 包含实例的数据和控制信息,包含如下内存结构: 1)Database buffer cache:缓存了从磁盘上检索的数据块. 2)Redo log buffer:缓存了写到磁盘之前的重做信息. 3)Shared pool:缓存了各用户间可共享的各种结构. 4)Large pool:一个可选

Java内存结构和数据类型

Java内存结构 内存就是暂时对数据的一个存储,他的存储速度非常的快,但是他是暂时的存储,从开机时开始存储,掉电或关机之后数据全部丢失.内存的生命周期就是开机和关机,开机的时候开始计算,关机什么都没有了.优点存储速度快,缺点容易坏掉,如果开机的时候,一点反映都没有,屏幕不亮键盘鼠标不亮,这种情况下一般都是内存条有问题.机器蓝屏,指令错误都是内存引起的. 程序的数据都是存储在内存里面,不存储在硬盘上因为硬盘不安全,可以读取数据.但是内存就不一样,内存他不允许去读取内存数据,并且速度很快所以我们的程

JVM内存结构——运行时数据区

在Java虚拟机规范中将Java运行时数据划分为6种,分别为: PC寄存器(程序计数器) Java栈 堆 方法区 运行时常量池 本地方法栈 一.PC寄存器(程序计数器) PC寄存器(Program Counter Register)严格来说是一个数据结构,它用于保存当前正常执行的程序的内存地址. 线程私有. 每个线程启动的时候,都会创建一个PC(Program Counter,程序计数器)寄存器.PC寄存器里保存有当前正在执行的JVM指令的地址. 每个线程都需要一个独立的程序计数器,各条线程之间

JVM内存结构小结

JVM按照运行时数据的存储结构来划分内存结构,JVM在运行Java程序时,将它们划分为几种不同格式的数据,分别存储在不同的区域,这些数据统一称为运行时数据(Runtime Data). 1.PC寄存器 PC寄存器严格来说是一个数据结构,它用于保存当前正常执行的程序的内部地址. 同时Java程序是多线程执行的,所以不可能一直按照线性执行下去,当有多个线程交叉执行时,被中断线程的程序当前执行到哪条语句对应的内存地址必然要保存下来,以便于它被恢复执行时再按照被中断时的指令地址继续执行下去. 2.Jav

java 内存结构

一.JVM是Java Virtual Machine(Java虚拟机)的缩写,不同平台上的JVM都是不同的,但向编译器提供相同的接口,编译器面向JVM生成JVM可以理解的.class字节码文件,对应平台的JVM对.class文件进行解释执行生成与该平台对应的机器码,JVM屏蔽了与具体操作系统平台相关的信息,在java跨平台实现中起到转换器的作用. 二.Java虚拟机包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回收堆和一个存储方法域. 1. 指令集 ............ 2. 寄存器 用

jvm系列(二):JVM内存结构

原文出处:纯洁的微笑 所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问题就会变的非常常见,了解JVM内存也是为了服务器出现性能问题的时候可以快速的了解那块的内存区域出现问题,以便于快速的解决生产故障. 先看一张图,这张图能很清晰的说明JVM内存结构布局. JVM内存结构主要有三大块:堆内存.方法区和栈.堆内存是JVM中最大的一块由年轻代和老年代组

浅析JVM内存结构和6大区域(转)

其实对于我们一般理解的计算机内存,它算是CPU与计算机打交道最频繁的区域,所有数据都是先经过硬盘至内存,然后由CPU再从内存中获取数据进行处理,又将数据保存到内存,通过分页或分片技术将内存中的数据再flush至硬盘.那JVM的内存结构到底是如何呢?JVM做为一个运行在操作系统上,但又独立于os运行的平台,它的内存至少应该包括象寄存器.堆栈等区域. JVM在运行时将数据划分为了6个区域来存储,而不仅仅是大家熟知的Heap区域,这6个区域图示如下: 下面将逐一介绍下各个区域所做的工作及其充当的功能.