Oracle非活动会话内存泄露带来的危机

2025-05-26Oracle / RAC

前言

![1756814914915-46b70c6b-35c4-4996-bf76-c771ca89b7bc.png](http://www.talkwithtrend.com/home/attachment/201703/29/933289_1490769221.png)

文章的最后将从运维与开发层面提炼共性的风险提示和注意事项,希望能对大家有所帮助和启发!## 1.问题来了

系统环境基本信息如下

![1756814914976-beb358d9-4095-4064-a4bc-3c80ee5cb9cb.jpg](http://www.talkwithtrend.com/home/attachment/201703/29/933289_1490769284.jpg)## 2.分析过程

2.1 数据库服务器内存配置

![1756814915054-29a0c750-f8e2-40c5-a501-ef46a212ad45.png](http://www.talkwithtrend.com/home/attachment/201703/29/933289_1490769354.png)

可以看到,数据库服务器配置了24G内存,但是free非小,只有22248*4k=86M.Topas中可以看到,计算内存占了96%,换页空间使用率高达40%。说明数据库服务器已经由于内存不足发生了大量换页,系统已经处于非常危险的状态,如果不及时处理,将可能出现宕机的情况。解决问题前,可通过定期逐个重启WAS或者数据库服务器来临时解决。

![1756814915107-a791c5cb-d384-41de-95fa-388d4117dc1b.png](http://www.talkwithtrend.com/home/attachment/201703/29/933289_1490769424.png)

可以看到,数据库实际占用的内存大小为SGA+PGA+所有服务进程在操作系统级的内存消耗,即10G + 9.1g + 500 * 4 =21G左右,机器内存是24G,那么出现内存紧张、换页就是必然的了!### 2.2 确认PGA内存泄漏

![1756814915160-b36ddb8e-9b00-44d1-a61e-4b1838b2e4a8.jpg](http://www.talkwithtrend.com/home/attachment/201703/29/933289_1490769488.jpg)

![1756814914915-46b70c6b-35c4-4996-bf76-c771ca89b7bc.png](http://www.talkwithtrend.com/home/attachment/201703/29/933289_1490769507.png)### 2.3 确认内存泄漏的进程信息

![1756814915262-59781d5d-0fef-4852-a681-ea9b0f0fdc69.jpg](http://www.talkwithtrend.com/home/attachment/201703/29/933289_1490769539.jpg)

![1756814915345-006394fa-5e1a-4ec4-9e11-c862daf86ff0.png](http://www.talkwithtrend.com/home/attachment/201703/29/933289_1490769558.png)

![1756814915397-31e89ca6-5841-4f48-85b1-c9b1b2ba97d5.jpg](http://www.talkwithtrend.com/home/attachment/201703/29/933289_1490769577.jpg)

取出package pkg_xx的代码,做进一步分析。### 2.4 对PGA内存占用情况进一步分解

![1756814915460-440a137e-e1c7-41c2-9f79-1f6f5a624edd.jpg](http://www.talkwithtrend.com/home/attachment/201703/29/933289_1490769605.jpg)

![1756814915535-36412239-94e8-4973-a560-69bbb2838dad.jpg](http://www.talkwithtrend.com/home/attachment/201703/29/933289_1490769624.jpg)

![1756814915605-6fd27a79-93ca-4073-a70a-6ae685f0a6d5.png](http://www.talkwithtrend.com/home/attachment/201703/29/933289_1490769648.png)

通过分类汇总和计算,占用最大的是“pmuccst:adt/recored”和”pl/sql vc2“,分别是220M和80M,这两个就是存储PL/SQL的集合、数组等内容,之前的分析得到验证。### 2.5 为什么非活动会话不释放PGA且PGA随时间增长

![1756814915656-a63ec21a-c902-4eb6-9417-faafc0ab0fb4.jpg](http://www.talkwithtrend.com/home/attachment/201703/29/933289_1490769760.jpg)

在调用PKG_XX. Sp_xx这个存储过程的其他存储过程/packgae处,对数组p_target.ret进行重新初始化,而不是让数组无限制扩展下去。### 2.6 重现问题的测试案例

![1756814915726-f8524730-07c7-46ad-ba45-3d963a148e67.jpg](http://www.talkwithtrend.com/home/attachment/201703/29/933289_1490769796.jpg)

![1756814915796-f0cebf43-a77a-4ae2-be7d-a760db6311e6.jpg](http://www.talkwithtrend.com/home/attachment/201703/29/933289_1490769835.jpg)

![1756814915871-5c88697a-c2be-4f7b-96c6-7fb258292cb6.jpg](http://www.talkwithtrend.com/home/attachment/201703/29/933289_1490769855.jpg)

![1756814915941-bdad4ffd-a866-4dbb-9915-17870df8d684.jpg](http://www.talkwithtrend.com/home/attachment/201703/29/933289_1490769875.jpg)

![1756814916013-ffe79f7e-fc2a-4743-a35e-e095257edca0.jpg](http://www.talkwithtrend.com/home/attachment/201703/29/933289_1490769887.jpg)### 2.7 真相大白

![1756814916086-37f26b00-7bba-424d-9645-0e8c0b890a03.jpg](http://www.talkwithtrend.com/home/attachment/201703/29/933289_1490769924.jpg)

即如果传入的数组p_target.ret不为空,那么将为数组p_target.ret不断增加元素的个数(对应p_target.ret.EXTEND处代码),并为每个元素赋值(即p_target.ret(p_target.ret.COUNT) := v_ret)

在项目组按照建议修改程序后,问题不再发生。### 2.8 风险提示

![1756814916163-66fb18b3-4d43-4511-8971-bb75318e823f.jpg](http://www.talkwithtrend.com/home/attachment/201703/29/933289_1490769996.jpg)