一、

Oracle

的三种内存管理方式

oracle

内存管理有三种方式,每一个

instance

只能够选择一种。这三种管理方式分别是

AMM

自动内存管理(

Automatic Memory Management

)、

ASSM

自动共享内存管理(

Auto Shared Memory Management

)、

msmm

手动共享内存管理(

Manual Shared Memory Management

)。

本文针对AMM

自动内存管理进行详细原理阐述。

二、

AMM

原理阐述

自动内存管理automatic memory management

(以下均称

AMM

)是

oracle 11g

新推出的新特性,意在对实例中的

PGA

SGA

进行自动管理。

AMM

是自动共享内存管理

automatic shared memory management

(

ASMM

)的拓展。

1.

在AMM

中涉及到的参数

- memory_max_target

- memory_target

- sga_max_size

- sga_target

- pga_aggregate_target

2.

AMM

的启用

方式一

:DBCA

图形界面下,要选择

AMM

自动内存管理,

step9

选择

use Automatic Memory Management

即可。如下图

方式二

:可以通过以下两个参数之一启用

- memory_target

:定义

sga

pga

总和的上限

- memory_max_taregt

:定义

memory_target

的上限

假设memory_max_target

设置为

1400m

memory_target

设置为

1000m

,那么只有

1000m

会被用在

instance

中,剩下的

400m

会被

oracle

用做储备。因为

memory_max_target

已经指定了,所以可以动态的修改

memory_target

参数,而不需要重启数据库。

如果memory_max_target

memory_target

相同,或者

memory_max_target

没有设置,那么

memory_target

就不能动态增长,并且修改后需要重启

instance

memory_max_target

将一直在参数文件中显式设置,或者被内存管理后台进程隐式设置。

memory_max_target

会定义

instance

锁定的内存。如果

memory_max_target

没有在参数文件中设置,那么他的大小默认为

mrmory_target

3.

AMM

的选项参数

所有的SGA

内存参数都会设置在

AMM

环境,如果

SGA

参数没有被设置,那么内存管理器将会进行以下设置:

60% to sga_target

40% to pga_aggregate_target

其他选项参数如下:

- sga_max_size

:这个参数设置

memory_target

SGA

的上限

- sga_target

:这个参数设置

memory_target

中的下限

- pga_aggregate_target

:这个参数仅是

instance

允许所有进程使用内存的总量。在

AMM

中,这个参数将随着

memory_target

的空闲空间进行浮动。

SGA

PGA

的总量不能超过

memory_target

。如果

sga_target

在参数文件中设置,它将代表着

SGA

的下限。此时

pga_aggregate_target

将会获得的内存

=

(

memory_target - sga_target

)

4.

通过memory_target

控制内存

DBA

可以通过一些选项去决定如何对内存中的各个组件进行分配。可以通过

MEMORY_TARGET

来控制

PGA

SGA

的增长。由于

memory_target

同时管理者

PGA

SGA

,内存控制器可以自由的在两者之间进行内存控制,没有任何的限制。如果要限制

PGA

的增长,可以设置

sga_target

参数大小,这就限制了

SGA

的最小值。在这种情况下,

PGA

就算增长,也不能让

SGA

缩小到超过他的最小值。如果要限制

SGA

的增长,可以设置

sga_max_size

的大小,这是

SGA

的上限值。

如果想要设置SGA

中某个组件的最小值,也可以进行单独设置。

SGA

中重要的组件如下:

- shared pool

(通过

shared_pool_size

参数管理)

- buffer cache

(通过

db_cache_size

参数管理)

- streams pool

(通过

streams_pool_size

参数管理)

- java pool

(通过

java_pool_size

参数管理)

- large pool

(通过

large_pool_size

参数管理)

三、

实验测试

情况一

只设置memory_target

- memory_target =1G

memory_max_target

不设置,所以它会被默认设置大小为

memory_target

执行以下SQL

SQL> show parameter memory;

NAME                           TYPE        VALUE

--------------------

--

-- ----------- ----------------------

hi_shared_memory_address   integer     0

memory_max_target            big integer 1G

memory_target                 big integer 1G

shared_memory_address       integer     0

SQL> select * from v$sgainfo where name like 'Maximum SGA%' or name like 'Free SGA%';

NAME                                  BYTES RES

-------------------------------- ---------- ---

Maximum SGA Size                 1068937216 No

Free SGA Memory Available         432013312

SQL> select component,current_size from v$memory_dynamic_components where component like '%Target%';

COMPONENT                                                CURRENT_SIZE

------------------------------------------------ ------------

SGA

Target                                                641728512

PGA Target                                                432013312

总结

1)

初始所有的内存(1G

)会作为共享内存分配,

v$sgainfo

显示

SGA

最大值为

1G

,因为

sga_max_size

没有设置,因此默认

sga

最大值为

memory_target

2)

v$sgainfo

显示,有

412M

是空闲的内存,这些空闲的内存可以用在

PGA

,或者动态的设置

SGA

3)

内存的初始比是60%

SGA,40%

PGA

。在

sga_target

pga_aggregate_target

没有设置的情况下,这是默认的情况。这也就意味着,内存的

60%

(

612M

)给

SGA

,内存的

40%

(

412M

)给

PGA

4)

v$memory_dynamic_components

显示sga_target

设置

612M

pga_aggregate_target

设置

412M

。这里的

pga_aggregate_target

设置为

412M

不意味着

PGA

已经达到了

412M

。而是说明有

412M

空间可以给

PGA

增长。如果它增长超过

412M

,那么内存控制器将会从

SGA

中获取内存。

情况二

设置以下参数

- memory_target=1G

- sga_target=300M

- pga_aggregate_target=100M

memory_max_target

不设置,所以它默认值等于

memory_target

执行以下SQL

SQL> select * from v$sgainfo where name like 'Maximum SGA%' or name like 'Free SGA%';

NAME

BYTES

RES

-------------------------------- ---------- ---

Maximum SGA Size

1068937216

No

Free SGA Memory Available         759169024

SQL> select component,current_size from v$memory_dynamic_components where component like '%Target%';

COMPONENT

CURRENT_SIZE

------------------------------------------------- ------------

SGA Target                                                 314572800

PGA Target                                                 759169024

总结:

1)

初始所有内存(1G

)会被作为共享内存分配。

v$sgainfo

显示,

SGA

最大值为

1G

,因为

SGA_MAX_SIZE

没有设置,所以它默认大小等于

memory_target

2)

v$sgainfo

显示

724M

为空闲内存,这个值是由

memory_target

减去

sga_target

得到的。这些空闲内存可以用于

PGA

SGA

,并由

oracle

自动控制。

3)

v$memory_dynamic_components

视图显示SGA

设置为

300M,

但是

PGA

设置为

724M

,这个大小是

memory_target

分配后的剩余部分。这里的

PGA

的值为

724M

,并不意味着

PGA

已经占有了

724M

,也是意味着

PGA

可以占有最大值为

724M

4)

sga_target_size

默认值为

1G

,理论上这个就是

SGA

的最大值。

情况三

设置以下参数

- memory_target=1G

- sga_max_size=500m

- sga_target=300m

- pga_aggregate_target=100m

由于memory_max_target

没有设置,所以它默认大小为

memory_target

SQL> select * from v$sgainfo where name like 'Maximum SGA%' or name like 'Free SGA%';

NAME                                  BYTES RES

-------------------------------- ---------- ---

Maximum SGA Size                  521936896 No

Free SGA Memory Available         209715200

SQL> select component,current_size from v$memory_dynamic_components where component like '%Target%';

COMPONENT                                       CURRENT_SIZE

---------------------------------------- ------------

SGA Target                                      314572800

PGA Target                                      759169024

总结:

1)

现在sga_target_size

设置为

500M

v$sgainfo

显示

SGA

最大值为

500M

2)

v$sgainfo

中显示,

SGA

可用值介于

sga_target

sga_max_size

之间

3)

超过sga_max_size

(

500M

)的内存不会给

SGA

使用,所以不会显示在

v$sgainfo

4)

v$memory_dynamic_components

视图中显示SGA

设置为

300M

PGA

设置为

700M

。这个

700M

的值,是

memory_target

减去

sga_target

得到的。

---- end ----

oracle启用amm,【内存管理】Oracle AMM自动内存管理详解相关推荐

  1. oracle8i substr,Oracle中的INSTR,NVL和SUBSTR函数的用法详解

    Oracle中INSTR的用法: INSTR方法的格式为 INSTR(源字符串, 要查找的字符串, 从第几个字符开始, 要找到第几个匹配的序号) 返回找到的位置,如果找不到则返回0. 例如:INSTR ...

  2. oracle数据库按日期查询,关于Oracle数据库日期范围查询的两种实现方法详解,oracle详解...

    关于Oracle数据库日期范围查询的两种实现方法详解,oracle详解 Oracle数据库日期范围查询有两种方式:to_char方式和to_date方式,接下来我们通过一个实例来介绍这一过程.我们假设 ...

  3. SQL全方位攻略:5. SQL “方言”大比拼:Oracle、MySQL、PostgreSQL限制检索行数语法详解(分页查询)

    系列文章目录 SQL全方位攻略:1.数据库介绍 SQL全方位攻略:2.SQL介绍 SQL全方位攻略:3.SQL标准 SQL全方位攻略:4. 标准SQL和SQL"方言" 文章目录 系 ...

  4. 非常运维 一体化终端安全管理系统自动安装脚本详解

    非常运维 一体化终端安全管理系统自动安装脚本详解   作者:高玉涵 时间:2019.03.13 13:52 博客:blog.csdn.net/cg_i 演示:https://v.youku.com/v ...

  5. python内存池_python内存监控工具memory_profiler和guppy的用法详解

    python内存监控工具memory_profiler和guppy的用法详解 发布时间:2020-08-21 19:44:58 来源:脚本之家 阅读:123 python2.7在内存管理上相比pyth ...

  6. python 内存分析工具_python内存监控工具memory_profiler和guppy的用法详解

    python2.7在内存管理上相比python3还是有些坑的,其释放后的内存仍然保留在python的内存池中,不被系统所用.python循环引用的变量不会被回收,这会导致程序越运行,占用的内存越大.我 ...

  7. TPOT自动机器学习参数详解

    TPOT自动机器学习参数详解 分类: 代码 class tpot.TPOTClassifier(generations=100, population_size=100,offspring_size= ...

  8. mysql 配置自动截断_MySql超长自动截断实例详解

    MySql超长自动截断实例详解 小伙伴问到一个问题,为啥在项目中调用插入或者更新语句时超长的字无法自动截断,而在navicat中直接执行是可以自动截断的? 如下 CREATE TABLE `p_app ...

  9. Tesla AI Day:特斯拉如何实现自动驾驶的详解

    之前上课的时候偶然间看到了知乎上关于特斯拉如何实现自动驾驶的详解,因为我本身就是做算法的,对自动驾驶也很感兴趣,得知信息来源于Tesla的AI Day,于是下课后马不停蹄就去找了回放好好学习学习. 视 ...

  10. 计算机控制系统顾树生课后答案,清华大学出版社-图书详情-《自动控制原理习题详解》...

    信息化时代的到来,为自动控制技术的应用开拓了更加广阔的空间.作为有关自动控制技术的基础理论--自动控制原理,已成为各高校许多学科和专业必修的技术基础课.深入理解和掌握<自动控制原理>中主要 ...

最新文章

  1. 基于linux服务器的性能分析与优化
  2. 八、Java中的i++和++i到底是什么?
  3. redis笔记_源码_内存分配
  4. mybatis批量插入数据到Oracle中的两种方式
  5. python-反射基础-hasattr-getattr-setattr
  6. 如何使用Postman和Newman在CI环境中自动化REST API端到端测试
  7. java如何同时画多个图形_如何绘制两个不同系列的箱线图?
  8. PHP+node采集58微聊聊天信息
  9. UI设计作品中经常会用到的设计技巧?|优漫动游
  10. 3个维度,帮助IT部门快速完成企业云盘选型!
  11. Intel-80386微处理器(IA-32架构)
  12. win2012R2无法打开匿名级安全令牌,安装.net 3.5
  13. redis 模糊删除keys
  14. 利用python做出电视剧收视率排行榜
  15. Vim 的 paste 模式
  16. Java实现荷兰国旗问题
  17. Python一键获取某排名第一的手游,所有英雄皮肤(附源码)
  18. 如何将word转换为带书签的pdf文件
  19. 【RPG Maker MV】RPG游戏《机器人养成记》制作笔记 - RPG Maker MV 界面介绍
  20. qsv的像素格式转换

热门文章

  1. 如何更优雅地使用 bilibili(b站)
  2. ARM开发板系统移植-----rootfs的制作
  3. AMD Opteron 185 + ATI RDX200 安装雪豹成功。
  4. Matlab使用regress函数进行回归分析
  5. MySQL命令行登录不上但是sqlyog能成功连接
  6. 工厂模式与建造者模式
  7. 前端面试题总结-初级
  8. 为什么现在90后员工离职率那么高?
  9. tcp_timestamps tcp_tw_recycle引起的服务器连接不上问题
  10. 北航计算机学院博士开题,关于硕士生、博士生开题报告的通知及规定-北航电子信息工程学院...