java.lang.OutOfMemoryError:超出GC开销限制:在weblogic中部署了应用程序

时间:2019-09-30 09:42:15

标签: java spring oracle weblogic eclipselink

我们已将应用程序部署在weblogic 12c上,并且日志中出现间歇性的后续异常

  

java.lang.OutOfMemoryError:超出了GC开销限制

当我同时看到应用程序log4j日志时,我可以看到以下异常

  

异常[EclipseLink-4002](Eclipse持久性服务-   2.5.2.v20140319-9ad6abd):org.eclipse.persistence.exceptions.DatabaseException内部   异常:weblogic.jdbc.extensions.PoolLimitSQLException:   weblogic.common.resourcepool.ResourceLimitException:无资源   当前在池TMP_DS_RW中可用以分配给应用程序,   请增加池的大小,然后重试。错误代码:0

     

原因:weblogic.jdbc.extensions.PoolLimitSQLException:   weblogic.common.resourcepool.ResourceLimitException:无资源   当前在池TMP_DS_RW中可用以分配给应用程序,   请增加池的大小,然后重试。.

这是由于池中的连接数耗尽而发生的吗?

weblogic的连接池大小和java.lang.OutOfMemoryError之间是否有任何关系?

因为每当池连接似乎耗尽时,我们都面临着java.lang.OutOfMemoryError。

我们尝试将堆大小从1G​​B增加到2GB,但是一段时间后我们仍然面临着java.lang.OutOfMemoryError。

在问题中使用eclipse堆转储分析器后,怀疑它正在显示

  

由“系统类”加载的类“ java.lang.ref.Finalizer”   加载程序”,占用了9,935,880(69.45%)字节。

注意::在weblogic的jndi datsource配置的“连接池”选项卡中,“最大容量”设置为30,并且我们正在使用oracle数据库。

3 个答案:

答案 0 :(得分:1)

由于数据库连接使用内存,因此可能。您的应用程序必须泄漏了连接池。尝试查看您的应用程序代码,并检查其在使用后是否正确释放数据库连接。

答案 1 :(得分:1)

java.lang.OutOfMemoryError:超出了GC开销限制

满足以下所有条件时,将引发此错误:

  
      
  1. 在完整GC中花费的时间超过了   -XX:GCTimeLimit = N标志默认值为98(即,如果98%的时间都花在了   GC)。
  2.   
  3. 完整GC回收的内存量小于以下指定的值:   -XX:GCHeapFreeLimit = N标志。缺省值为2,表示如果   在完整的GC期间,只有不到2%的堆被释放,可以满足此条件。
  4.   
  5. 以上两个条件在五个连续的完整GC周期中均成立(即   值不可调整)。   堆分析| 187
  6.   
  7. -XX:+ UseGCOverheadLimit标志的值为true(默认情况下为默认值)。
  8.   

来源:《 Java性能》权威指南

如果增加堆大小不能解决问题,请检查CPU是否不是瓶颈。

-XX:+PrintGCDetails
-Xloggc:<path>

这会将有关GC的信息记录到。如果看到堆大小不停地增加,则可能发生内存泄漏,并且可能没有关闭连接。

答案 2 :(得分:0)

您是否尝试监视来自WebLogic控制台的连接? 服务->数据源->(选择数据源)->(选项卡)监视,在那里您应该具有连接的“实时”视图。