ORA-27102: out of memory 解决实例

本文介绍了一次Oracle数据库SGA调优过程中遇到的问题及解决方法。通过调整db_cache_size导致sga_max_size自动增大,最终因32位系统内存限制引发ORA-27102错误。文章详细解释了问题原因并提供了两种解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

最开始一次给客户做优化设置的时候,出现过一个这样的错,那时候没有经验,数据库怎么都起不来,自己吓得不行了,回来幸好找到一个有经验的前辈,才得以解决。

时间几年过去了,再也没有发生,这几天忽然想起一起那次的事,不由的想把当时的情况模拟出来,自己来处理一次叻。

问题是怎么出现的,

首先在32位机器上,配置sga的内存超过1.5G,基本上就出现这个问题叻

这里还有一点要知道,sga_max_size可以自动来变动的,当sga的内存组件的和小于sga_max_size的时候,sga_max_size不会改变,还是维持自己的值,如果超过了这个和,sga_max_size的就会自动变动成和的值,这个你可以自己试试。

看看我的内存情况

Total System Global Area  965812724 bytes

Fixed Size                   455156 bytes

Variable Size             251658240 bytes

Database Buffers          713031680 bytes

Redo Buffers                 667648 bytes

这是我的windowxp上的实例,

我现在想调整database buffer的值到1G,我只需要设置db_cache_size到1G,而不设置sga_max_size,这时由于各组件值大于sga_max_size目前值,所以sga_max_size自动变化。

SQL>alter system set db_cache_size=1000M scope=spfile;

SQL> shutdown immediate;

SQL> startup;

看看现在的内存信息

Total System Global Area 1301357848 bytes

Fixed Size                   455960 bytes

Variable Size             251658240 bytes

Database Buffers         1048576000 bytes

Redo Buffers                 667648 bytes

发现sga_max_size已经自动变化

SQL> show parameters sga_

NAME                                 TYPE                              VALUE

———————————— ——————————— ———

sga_max_size                         big integer                       130135784

也已经变化叻。

 

现在模拟我们的问题吧

不过模拟前,先把我们的init.Ora备份一下,不备份init.Ora当然也不可以不过,等下恢复设置的东西太多,麻烦。

先把我们调整内存钱的parameter备份一下吧

SQL>create  pfile=’F:/Synchrophy/Server/oracle/admin/ORA9i/pfile/init.bak.ora’ from spfile;

这句话就是把你的spfile备份到pfile文件里,由于spfile是二进制的文件,不好修改,所以我们一般用这样的形式来备份。

备份好。我们可以放心的改我们的内存叻

SQL> alter system set db_cache_size=1500M scope=spfile;

SQL> shutdown immediate;

SQL> startup;

现在问题出现了吧

一起看看

ORA-27102: out of memory

OSD-00022: Message 22 not found;  product=RDBMS; facility=SOSD

O/S-Error: (OS 8) Not enough storage is available to process this command.

为什么会出现这样的问题叻,是因为在32位的机器上Oracle的内存有限制,内存最大4G,32位留50%给操作系统,window是单线程的,不能超过1.7G。out of memory也就出来叻。

那么碰到这个问题我们如何解决了。如果了解Oracle的init的启动的话,做这个恢复就比较简单了,默认oralce是从spfile先启动的,

你可以这样查到路径

SQL> show parameter pfile

 

NAME                                 TYPE        VALUE

———————————— ———– ——————————

spfile                               string      %ORACLE_HOME%/DATABASE/SPFILE%

                                                 ORACLE_SID%.ORA

所以你先在可以通过修改这个文件里的相关参数的值来恢复,不过修复的时候注意,这是个二进制文件,要保持二进制的格式。

还有方法用我们刚才的pfile来恢复。

SQL>startup pfile=’你备份的init.ora’;

如果在window下,需要

SQL>create spfile from pfile=’你备份的init.ora’;

重启服务,即可。

### 关于内存不足错误的原因分析与解决方案 #### 原因分析 内存不足错误通常发生在应用程序尝试分配超出可用物理或虚拟内存资源的情况下。以下是几种常见场景及其可能原因: 1. **Java Heap Space 错误** 当 Java 应用程序试图分配的对象超出了 JVM 的堆空间大小时,会抛出 `OutOfMemoryError`。这可能是由于初始堆大小过小或者存在内存泄漏引起的[^1]。 2. **PermGen Space 错误** 这种错误主要出现在较旧版本的 JDK 中(如 JDK 7 及更早)。当类加载器无法释放已加载的类定义,并且这些类占用的空间超过了 Permanent Generation 区域的最大容量时,就会发生此错误。解决方法通常是增加 PermGen 空间大小或升级到支持 Metaspace 的新版本 JDK。 3. **CPLEX 内存管理问题** 如果在优化过程中频繁调用 CPLEX 并未清理之前的解池,则可能导致内存逐渐耗尽并最终触发 `Out of memory` 错误。这是因为每次迭代都会向解池中添加新的候选解而未能及时清除无用数据[^2]。 4. **Eclipse 默认 JVM 配置限制** Eclipse 启动时使用的默认最小/最大堆尺寸较小 (-Xms8m -Xmx128m),对于某些复杂项目来说远远不够。因此,在执行高负载操作之前应该适当调整这些参数以避免 OOM 异常[^3]。 5. **Linux 下 Jack 编译工具链中的 OOM** Android 开发环境中如果遇到类似的 “out of memory” 报告,则可以通过修改 jack server 的启动选项来增大其允许使用的 RAM 数量。具体做法包括编辑配置文件以及重新初始化服务进程[^4]。 6. **Oracle 数据库实例启动失败 (Windows)** 对于 Oracle 数据库而言,特别是在 Windows 上运行 32 位操作系统时,可能会因为设置了不合适的 SGA 参数而导致 ORA-27102 错误消息显示缺少足够的连续地址空间锁定整个共享全局区(SGA)[^5]。 #### 解决方案建议 针对以上提到的各种情况分别给出如下应对措施: 1. **扩大 Java 虚拟机堆内存** 修改应用服务器或其他依赖环境变量设置命令行参数 `-Xms<initial_size>` 和 `-Xmx<maximum_size>`, 如下所示: ```bash java -Xms512M -Xmx2G MyApplication ``` 2. **提升 PermGen/Metaspace 容限** 使用以下任一方式扩展永久代存储能力(适用于老版JDK), 或者切换至最新发行版启用元空间替代机制(-XX:MetaspaceSize,-XX:MaxMetaspaceSize): ```bash java -XX:PermSize=256M -XX:MaxPermSize=512M ... ``` 3. **控制 CPLEX 解池规模** 设置合理的解数量上限并通过 API 显式删除不再需要的结果对象从而减少累积消耗. 4. **自定义 Eclipse VM Arguments** 打开 Run Configuration -> Arguments Tab 输入更大的 Xmx 值比如下面这样子: ```text -Xms256m -Xmx1024m ``` 5. **调节 Linux 杰克编译器内存限额** 更新 ~/.jack 文件内容并将相关环境变量导出后再重启杰克守护线程. ```bash export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx8g" ./prebuilts/sdk/tools/jack-admin stop-server && \ ./prebuilts/sdk/tools/jack-admin start-server ``` 6. **修正 Oracle 初始化脚本冲突项** 检查 init<SID>.ora 是否含有不当设定 LOCK_SGA=true 结合实际硬件条件合理规划总SGA大小. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

inthirties

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值