在 Linux 上运行 Oracle 数据库时,发现它“占很多内存”是正常的,主要原因如下:
Oracle 不是一个“轻量程序”,它启动后就会分配并长期占用大量内存,主要包括:
这是 Oracle 最核心、最占内存的部分,用于:
SGA 一旦分配,就不会轻易释放给操作系统。
常见配置:
SHOW PARAMETER sga_target;
SHOW PARAMETER sga_max_size;
很多生产环境 SGA 设置几 GB 甚至几十 GB。
每个 数据库连接(会话) 都会分配 PGA,用于:
连接数越多,PGA 占用越多:
SHOW PARAMETER pga_aggregate_target;
Oracle 会启动很多后台进程,例如:
每个进程都会占用一定内存。
你看到的 free -m 中:
used 高buff/cache 高这不一定是 Oracle 吃了内存,Linux 会自动用空闲内存做文件缓存,提升性能。
free -h
真正要看的是:
available
生产 Oracle 通常启用 HugePages:
grep Huge /proc/meminfo
sga_target = 20G
pga_aggregate_target = 8G
机器只有 24G,那就直接爆。
很多 DBCA 默认按“生产”配置。
一台机器跑多个实例(多租户、测试库)。
ps -eo pid,user,rss,cmd | grep oracle
SELECT * FROM v$sga;
SELECT * FROM v$pgastat;
free -h
top
htop
✅ 调小 SGA:
ALTER SYSTEM SET sga_target=4G SCOPE=SPFILE;
✅ 调小 PGA:
ALTER SYSTEM SET pga_aggregate_target=1G SCOPE=SPFILE;
✅ 控制连接数(用连接池)
✅ 测试环境不要开 HugePages
Oracle 占内存,是因为它本来就是“内存型数据库”,SGA/PGA 是设计上就要长期占用内存,不是内存泄漏。
如果你愿意,可以:
free -hshow parameter sga我可以帮你精确判断是不是“正常占用”还是“配置不合理”。