【问题标题】:java.lang.OutOfMemoryError: GC overhead limit exceeded : Application deployed in weblogicjava.lang.OutOfMemoryError:GC 开销限制超出:应用程序部署在 weblogic 中
【发布时间】:2019-09-30 09:42:15
【问题描述】:

我们在 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。

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

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

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

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

【问题讨论】:

  • 9,935,880 (69.45%) 是什么?我问这个问题是因为 1GB 或 2GB 要大得多
  • @devwebcl - 1 GB
  • 最好的方法是让堆进行分析。可能是复制自stackoverflow.com/questions/1393486/…
  • 池连接耗尽意味着您的数据库操作处于负载状态。同样的负载也可以解释为什么您几乎在同一时间耗尽了内存。您需要分析服务器中正在发生的事情的性能,以确定应该做什么。增加连接数可能会导致使用更多内存,而相反,减少连接数可能会导致线程等待时间延长,从而产生瓶颈,从而降低整体内存消耗。这完全取决于您的应用在做什么。

标签: java spring oracle weblogic eclipselink


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    当满足以下所有条件时会抛出此错误:

    1. 在完整 GC 中花费的时间量超过了由 -XX:GCTimeLimit=N 标志。默认值为 98(即,如果 98% 的时间都花在 GC)。
    2. full GC 回收的内存量小于指定的值 -XX:GCHeapFreeLimit=N 标志。默认值为 2,这意味着如果 在完整 GC 期间释放不到 2% 的堆,则满足此条件。
    3. 上述两个条件在连续五个完整的 GC 周期(即 值不可调整)。 堆分析 | 187
    4. -XX:+UseGCOverheadLimit 标志的值为真(默认为真)。

    来源:Java 性能,权威指南

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

    -XX:+PrintGCDetails
    -Xloggc:<path>
    

    这会将有关 GC 的信息记录到 .如果您看到堆大小的不断增加,那么您有内存泄漏并且可能没有关闭您的连接。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-21
        • 2016-08-10
        • 2020-07-05
        相关资源
        最近更新 更多