如何定位线上OOM

造成OOM的原因

1一次性申请太多对象。如:从数据库获取大量数据。
解决方法:更改申请对象的数量。如:做个分页。

2内存资源使用完未释放。如:太多线程建立数据库连接而未释放。
解决方法:使用线程池。

3本身资源不够,无法支持日常的使用。
jmap -heap 进程名:查看特定java进程的堆内存信息。

对于上述1.2问题的解决办法如下:

如何快速定位OOM

1系统已经挂掉了:提前设置如下参数,获取dump文件,再使用jvisualVM定位。
在这里插入图片描述
2系统还没有OOM:
快要OOM或者频繁FULL GC时,使用如下命令到处dump文件在这里插入图片描述

### 游标导致内存溢出错误的原因及解决方案 当遇到游标引发的 `out of memory` 错误(例如错误代码 536870904),通常表明数据库或应用程序在处理大量数据时未能有效管理资源。以下是具体原因及其对应的解决方案。 #### 原因分析 1. **共享池不足** 数据库中的共享池可能由于频繁创建和销毁游标而耗尽空间,这可能导致无法分配足够的内存来支持新查询的操作[^2]。如果共享池配置过小或者存在未释放的会话级缓存,则容易触发此类问题。 2. **大对象存储不当** 如果应用层涉及大量的 LOB 类型操作(如 BLOB/CLOB),这些对象可能会占用过多堆栈区域或其他非连续地址空间,进而影响整个系统的稳定性[^3]。即使物理 RAM 足够充裕,逻辑上的碎片化也可能造成类似的 OOM 表现。 3. **连接数过高** 当并发用户数量增加时,每个活动进程都需要额外保留一部分私有区段用于执行计划保存以及中间结果集暂存等工作;一旦超出硬件承载能力范围之外就会报错提示 insufficient system resources available during online operation at line number xxx[^1]. 4. **不合理的 SQL 编写习惯** 复杂嵌套子句、缺少索引优化等因素都会加重 CPU 和 I/O 的负担,间接加剧了临时表文件膨胀现象的发生频率并最终演变成致命性的崩溃事故。 #### 解决方案建议 针对以上提到的各种可能性因素分别给出如下应对措施: - #### 扩展 SGA 参数设置 调整初始化参数文件(init<sid>.ora 或 spfile),增大 sga_target 及其下属组件尺寸比如 java_pool_size,pga_aggregate_target 等值以适应更复杂的业务场景需求[^2]: ```sql ALTER SYSTEM SET SHARED_POOL_SIZE=XXM SCOPE=BOTH; ``` - #### 定期清理无用 session 通过监控 v$session 动态视图定位长期挂起却没有任何实质意义的任务实例,并强制断开它们从而回收被侵占掉的部分宝贵计算力资产: ```sql alter system kill session 'SID,SERIAL#'; ``` - #### 改善程序设计模式 对于那些经常需要用到批量读取功能的应用模块来说,可以考虑采用分页机制代替一次性加载全部记录的方式减少瞬时峰值消耗水平;另外就是尽量避免重复定义相同名称但不同含义的对象结构以免引起混淆歧义情况出现[^3]. - #### 使用 AWR 报告诊断性能瓶颈 启用自动工作负载资料档案馆(Automatic Workload Repository)定期收集历史趋势变化曲线图表辅助判断是否存在潜在风险隐患待消除[^4]. ```bash @?/rdbms/admin/awrrpt.sql ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值