在实际使用过程中经常发现DMSERVER进程在OS中的内存占用使用远远超过实际情况。原因有很多,下面列出其中一种:
测试库版本
SQL> select id_code;
LINEID ID_CODE
---------- -----------------------------------
1 --03134283938-20221019-172201-20018
测试步骤如下:
#查看dmserver在OS上的内存占用
SQL> host ps aux | grep dmserver | grep -v grep
dmdba 20398 16.8 24.0 3518472 1938328 pts/2 Sl+ 11:21 0:58 dmserver path=dm.ini
#向测试表插入数据,模拟排序操作
SQL> insert into d select * from a order by 2;
affect rows 80000000
used time: 00:01:12.785. Execute id is 602.
#查看dmserver在OS上的内存占用
SQL> host ps aux | grep dmserver | grep -v grep
dmdba 20398 24.7 42.8 5289780 3457352 pts/2 Sl+ 11:21 1:48 dmserver path=dm.ini
#退出会话
SQL> exit
#查看dmserver在OS上的内存占用,又回到了测试前
[dmdba@node1 ~]$ ps aux | grep dmserver | grep -v grep
dmdba 20398 24.6 23.8 3518520 1927272 pts/2 Sl+ 11:21 1:51 dmserver path=dm.ini
以上SQL执行的过程中查询V$MEM_POOL视图,DATA_SIZE字段的值不断增长,SQL语句执行完毕后,DATA_SIZE增加的部分消失。但从上图中可见,只有会话退出后在OS上的显示才回到测试前。分析原因如下:
用lsof命令搜索上述会话的thrd_id,显示打开了许多文件。会话退出后相关资源完全释放。