惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
小众软件
小众软件
GbyAI
GbyAI
B
Blog RSS Feed
月光博客
月光博客
A
About on SuperTechFans
Microsoft Security Blog
Microsoft Security Blog
Blog — PlanetScale
Blog — PlanetScale
U
Unit 42
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
Recent Announcements
Recent Announcements
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Vercel News
Vercel News
F
Fortinet All Blogs
Apple Machine Learning Research
Apple Machine Learning Research
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
雷峰网
雷峰网
Google DeepMind News
Google DeepMind News
MongoDB | Blog
MongoDB | Blog
Engineering at Meta
Engineering at Meta
aimingoo的专栏
aimingoo的专栏
博客园_首页
G
Google Developers Blog

博客园 - dirgo

springboot里的application.yml文件的logging:下的配置 Flutter的SDK国内下载方法及AndroidStudio配置打包方法 minio数据迁移方法 [转]flutter入门 Elasticsearch介绍以及在spring项目里的使用方法 moxa NPort 5100 Linux real tty驱动安装 VirtualBox 的网络模式 Oracle关联表删除数据和更新数据 logback-spring.xml引入了base.xml日志文件默认生成在哪里? application.yml中Logback相关配置 org/springframework/boot/logging/logback/defaults.xml的内容和作用 logback-spring.xml 中<include resource="org/springframework/boot/logging/logback/base.xml"/>作用 Spring Boot 项目 Logback 日志框架配置文件logback-spring.xml详解 Oracle DataBaseLink 提示密码过期 梅特勒托-托利多衡器串口连续输出数据格式的说明 utf-8编码详解 mybaits updateWrapper更新报错:无效的列类型: 1111 @RequestPart和@RequestParam有什么区别 如何避免Mass Assignment漏洞? 关于vxe-table v4 导出大数据量excel浏览器卡死问题的解决 开源的Linux换源和安装docker脚本 wsl常用命令 使用网页静默打印 在Oracle中,授予用户角色和权限 Linux下查看当前哪些端口在监听状态,哪些端口在连接状态 mobaxterm常用配置 Windows下udp工具 Oracle表空间用户授权创建dblink等操作 用nmap扫描找出某个网段下空闲的ip脚本 Oracle 19c 常用运维 SQL
Oracle 19c占内存高的解决方法
dirgo · 2026-02-27 · via 博客园 - dirgo

因为Oracle 19c安装后默认的内存配置是为生产环境设计的,会尽可能多地占用系统内存。我们可以通过调整内存参数来大幅降低占用。

🎯 内存占用分析

Oracle的内存主要分为两部分:

  • SGA(系统全局区):占大头,用于缓存数据、SQL等
  • PGA(程序全局区):用于排序、哈希等操作

你看到的12GB很可能是SGA被设置了较大的值。对于开发测试环境,我们可以把总内存限制在2GB-4GB就足够用了。

⚡ 立即释放内存的“急救方案”

如果你想让Oracle立刻把占用的内存吐出来,最快的方法是重启服务

  1. 打开Windows服务管理器(services.msc
  2. 找到Oracle相关的服务(如OracleServiceORCL19
  3. 右键点击选择“重新启动”

重启后Oracle会重新初始化内存,通常会释放大量已占用的内存。但这只是临时方案,重启后又会回到原来水平。

🔧 永久限制内存的配置方案

要让Oracle长期稳定地占用较少内存,需要修改内存参数。这里提供两种方法,推荐方法一(更简单)。

✅ 方法一:启用自动内存管理(AMM,推荐)

自动内存管理让Oracle自动在SGA和PGA之间动态分配内存,你只需要设置一个总上限。

操作步骤

  1. 以管理员身份登录数据库

    sqlplus / as sysdba
    
  2. 查看当前内存设置

    SHOW PARAMETER memory_target
    SHOW PARAMETER sga_target
    SHOW PARAMETER pga_aggregate_target
    
  3. 设置总内存上限(例如限制为2GB):

    -- 先设置最大上限(需要重启)
    ALTER SYSTEM SET memory_max_target = 2G SCOPE=SPFILE;
    
    -- 关闭SGA和PGA的固定值,交给自动管理
    ALTER SYSTEM SET sga_target = 0 SCOPE=SPFILE;
    ALTER SYSTEM SET pga_aggregate_target = 0 SCOPE=SPFILE;
    
  4. 重启数据库使参数生效

    SHUTDOWN IMMEDIATE;
    STARTUP;
    
  5. 设置当前内存目标(重启后执行):

    ALTER SYSTEM SET memory_target = 2G;
    
  6. 验证配置

    SHOW PARAMETER memory_target;
    

设置后,Oracle总内存会控制在2GB左右,并且会根据负载自动调整。

✅ 方法二:手动配置SGA和PGA

如果你希望对内存分配更精细地控制,可以分别设置SGA和PGA。

示例配置(总内存约3GB)

ALTER SYSTEM SET sga_max_size = 2G SCOPE=SPFILE;
ALTER SYSTEM SET sga_target = 2G SCOPE=SPFILE;
ALTER SYSTEM SET pga_aggregate_target = 1G SCOPE=SPFILE;

-- 重启生效
SHUTDOWN IMMEDIATE;
STARTUP;

针对OLTP开发环境的建议值

  • SGA:物理内存的40%-50%(如果总内存16GB,设6-8GB)
  • PGA:物理内存的10%-20%(如果总内存16GB,设2-3GB)

📊 两种方法的对比

方案 优点 缺点 适用场景
AMM 配置简单,自动调优,无需操心SGA/PGA比例 动态调整有微小开销 大多数开发测试环境
手动配置 控制粒度更细,性能可预测 需要根据负载调整 特定负载测试、模拟生产

🔍 如果以上方法无效的排查思路

如果调整后内存占用依然很高,可以检查以下特殊情况:

  1. 检查Streams Pool等特殊组件:有案例显示第三方工具或错误配置可能导致某个内存池异常占用(如Streams Pool占用96GB)。可以通过查询确认:

    SELECT * FROM v$sgainfo;
    
  2. 检查内核参数(Windows对应为注册表):Linux系统需要调整shmmax/shmall等参数,Windows系统通常不需要额外配置,但如果之前调整过Oracle用户的内存锁定权限,可能会影响内存释放。

  3. 关闭不必要的数据库特性:如Memory Optimized Rowstore(需要设置MEMOPTIMIZE_POOL_SIZE=0)。

💡 最终建议

对于你的开发测试环境,我推荐采用方法一(AMM)

  • 先设置 memory_max_target = 2G
  • 重启后设置 memory_target = 2G

这样Oracle会在2GB以内自动管理内存,既能满足开发测试需求,又不会拖慢你的电脑。如果后续发现内存不够(比如跑大批量数据处理),可以随时调大这个值。

如果你在执行过程中遇到权限问题或参数修改失败,可以随时告诉我具体的错误信息,我帮你看看怎么处理~