如何解决Oracle中的内存泄漏问题

时间:2017-01-06 15:53:07

标签: oracle memory-leaks out-of-memory

我在Oracle中有一些工作可以运行几个小时,进行大量涉及(但不限于)XmlTransform的计算。我注意到PGA内存逐渐增加(并且性能下降),直到某些时候作业因内存不足(PGA)消息而失败。我们已经应用了一些修复程序,但它们似乎无法解决问题。 停止作业并重新启动它们,解决了我的问题,性能再次良好且内存很低...... 所有代码都是用PL / SQL和SQL编写的。

问题: 由于我想尽快解决这个问题,我想知道如何在Oracle中解决这类问题。

我的主要想法是以某种方式:

  • 使用高级队列
  • 在一段时间后(可能是最简单的解决方案)重新启动作业
  • 重启当前会话?
  • 在另一个会话中同步执行一些代码,也许是另一个工作。

Oracle 12.1.0.2

编辑:正如这里提到的XMLTransform示例代码:

function i_Convert_Xml_To_Clob (p_Zoek_Result_Type_Id in Zoek_Result_Type.Zoek_Result_Type_Id%type,
                                p_Xml                 in xmltype,
                                p_Xml_Transformation  in xmltype) return clob is
  mResult clob;
begin
  if p_Xml_Transformation is not null then
    select Xmltransform (p_Xml, p_Xml_Transformation).getclobval()
      into mResult
    from Dual;
  elsif p_Xml is not null then
    mResult := p_Xml.getclobval();
  else
    mResult := null;
  end if;

  return mResult;
end i_Convert_Xml_To_Clob; 

1 个答案:

答案 0 :(得分:2)

您或DBA可以使用V $ TEMPORARY_LOBS监控来自其他会话的临时使用情况。如果lobs数量增加,则会话不会正确释放它们,这将导致PGA使用量增加(注意这不是泄漏)。

最常见的情况是处理返回一个或多个临时字体的语句,例如XMLTRANSMFORM()。getClobVal()。

(Java?)开发人员忘记TEMP LOB是SESSION级别对象并且由于客户端句柄或引用超出范围而不会释放与之相关的资源,这种情况并不少见。例如,如果您将一个TEMP lob放入JAVA Clob对象中,则不能依赖垃圾收集来清理LOB。您必须在使用下一个lob覆盖之前显式释放lob,否则服务器将保留LOB资源,直到会话结束。

由于我们没有示例代码,因此我们无法明确说明您的情况就是这样。