当前位置: 首页 > java >正文

Oracle SHARED POOLRESERVED FREE LIST

随着会话不停地从SHARED POOL中分配内存,SHARED POOL中完整连续的内存区域可能会越来越小,这时如果会话需要分配大内存,可能会分配失败。为了减小出现该类型错误的概率,Oracle设置了保留内存区域,该区域用RESERVED FREE LIST管理。其大小由参数SHARED_POOL_RESERVED_SIZE决定(最小为5000字节,最大不能超过SHARED POOL大小的一半)。RESERVED FREE LIST在最高级堆中出现,可以通过DUMP HEAP观察RESERVED FREE LIST:

RESERVED FREE LISTS:Reserved bucket 0 size=16Reserved bucket 1 size=4400Reserved bucket 2 size=8204Reserved bucket 3 size=8460Reserved bucket 4 size=8464Reserved bucket 5 size=8468Reserved bucket 6 size=8472Reserved bucket 7 size=9296Reserved bucket 8 size=9300Reserved bucket 9 size=12320Reserved bucket 10 size=12324Reserved bucket 11 size=16396Reserved bucket 12 size=32780Reserved bucket 13 size=65548Chunk 67000050 sz=   839576  R-free      "               "Chunk 68000050 sz=   839576  R-free      "               "Chunk 69000050 sz=   839576  R-free      "               "Chunk 6b00007c sz=   839532  R-free      "               "Reserved bucket 14 size=7968764
Total reserved free space   =  3358260

Oracle对进入RESERVED FREE LIST的对象有大小限制,即只有大于_shared_pool_reserved_min_alloc隐含参数阀值(默认值为4400)的CURSOR才能进入RESERVED FREE LIST。所以有可能出现SHARED POOL有大量空闲空间但进程却无法分配到所需内存的情况,如下所示:

Tue Aug  8 10:52:48 2008
Errors in file /oracle/admin/zhjs/bdump/zhjs2_j000_10084.trc:
ORA-00604: error occurred at recursive SQL level 1
ORA-04031: unable to allocate 4116 bytes of shared memory ("shared pool","JOB$SYS","KGLS heap","KGLS MEM BLOCK"
)

产生这种现象主要有以下2个原因:
SHARED POOL内存碎片化严重,进程无法获得所需大小的内存。即FREE LIST和LRU LIST内存碎片化严重。
所需内存大小没有达到从RESERVED FREE LIST中分配内存的阀值。
通过查询视图V$SHARED_POOL_RESERVED可以观察RESERVED FREE LIST的状态,如下所示:

SQL> select FREE_SPACE,AVG_FREE_SIZE,USED_SPACE,REQUEST_FAILURES,LAST_FAILURE_SIZE2  from V$SHARED_POOL_RESERVED;FREE_SPACE AVG_FREE_SIZE USED_SPACE REQUEST_FAILURES LAST_FAILURE_SIZE
---------- ------------- ---------- ---------------- -----------------663913712    155958.119   27944704             2110              4192

可以看到系统共出现过2110次内存分配失败,最近一次分配的内存大小是4192字节,为了减少内存分配失败次数,可以调整_shared_pool_reserved_min_alloc隐含参数至4100字节。需要注意的是,由于存在BUG 3669074,在Oracle 10.2之前查询视图V$SHARED_POOL_RESERVED可能会导致错误结果,可以使用以下脚本观察RESERVED FREE LIST:

select p.inst_id, p.free_space, p.avg_free_size, p.free_count, 
p.max_free_size, p.used_space, p.avg_used_size, p.used_count, p.max_used_size, 
s.requests, s.request_misses, s.last_miss_size, s.max_miss_size, 
s.request_failures, s.last_failure_size, s.aborted_request_threshold, 
s.aborted_requests, s.last_aborted_size 
from (select avg(x$ksmspr.inst_id) inst_id, 
sum(decode(ksmchcls,'R-free',ksmchsiz,0)) free_space, 
avg(decode(ksmchcls,'R-free',ksmchsiz,0)) avg_free_size, 
sum(decode(ksmchcls,'R-free',1,0)) free_count, 
max(decode(ksmchcls,'R-free',ksmchsiz,0)) max_free_size, 
sum(decode(ksmchcls,'R-free',0,ksmchsiz)) used_space, 
avg(decode(ksmchcls,'R-free',0,ksmchsiz)) avg_used_size,   
sum(decode(ksmchcls,'R-free',0,1)) used_count, 
max(decode(ksmchcls,'R-free',0,ksmchsiz)) max_used_size from x$ksmspr 
where ksmchcom not like '%reserved sto%') p, (select sum(kghlurcn) requests, sum(kghlurmi) request_misses, max(kghlurmz) last_miss_size, max(kghlurmx) max_miss_size, sum(kghlunfu) request_failures, max(kghlunfs) last_failure_size, max(kghlumxa) aborted_request_threshold, sum(kghlumer) aborted_requests, max(kghlumes) last_aborted_size from x$kghlu) s;

由于硬解析时需要从SHARED POOL中分配内存(分配内存时需要持有SHARED POOL LATCH),所以在硬解析(HARD PARSE)比较多的系统中,非常容易引起SHARED POOL LATCH的争用。为了减缓该LATCH的争用,从Oracle 9i开始,共享池可分为多个子池来管理(最多7个),下一节将主要讲解SHARED POOL的SUB POOL技术。

http://www.xdnf.cn/news/8953.html

相关文章:

  • OWA登录问题分析与解决方案
  • Vite 介绍
  • 【算法提升】牛牛冲钻五 最长无重复子数组 重排字符串 one_day
  • Hive 分桶(Bucketing)深度解析:原理、实战与核心概念对比
  • 水墨色调中国风PPT模版分享
  • 商务风企业公司推广培训计划PPT模版分享
  • IntelliJ IDEA Ultimate修改软件地区使用
  • C++模板与字符串:从入门到精通
  • python打卡day37
  • 云原生架构核心特性详解
  • AI时代新词-提示词、Agent、Chat:AI时代的交互新概念
  • 无限debugger
  • 特征分解:线性代数在AI大模型中的核心工具
  • AT_abc404_d [ABC404D] Goin#39; to the Zoo 题解
  • C++ 图像处理库 CxImage 简介 (迁移至OpenCV)
  • 精益数据分析(86/126):Parse.ly的转型启示——从用户增长到商业变现的艰难跨越
  • 地理卷积神经网络加权回归模型的详细实现方案
  • Netty应用:从零搭建Java游戏服务器网络框架
  • python:机器学习(KNN算法)
  • 【Linux】Linux 操作系统 - 18 , 重谈文件(二) ~ 文件描述符和重定向原理 , 手把手带你彻底理解 !!!
  • 游戏引擎学习第311天:支持手动排序
  • 单纯形是什么
  • 滑动窗口算法实时计算QPS:Java实现与原理分析
  • Steam发布游戏过程的若干问题
  • ABP VNext + Elsa Workflow:实现可视化流程引擎
  • 袁庭新陕西理工大学讲座报告:从技术原理到行业变革,构建AI时代的职业护城河
  • 每日算法刷题Day16 5.26:leetcode不定长滑动窗口求子数组个数越短越合法2道题+恰好型3道题,用时1h20min
  • Simple Factory(简单工厂)
  • PHP轻量级聊天室源码(源码下载)
  • HTML与Flask表单之间的关系(chatgtp提供)