2

我们在 weblogic 12c 上部署了应用程序,我们在日志中看到间歇性以下异常

 

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

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

异常 [EclipseLink-4002] (Eclipse Persistence Services - 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”占用9,935,880(69.45%)字节。

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

4

3 回答 3

1

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

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

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

资料来源:Java 性能,权威指南

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

-XX:+PrintGCDetails
-Xloggc:<path>

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

于 2019-10-02T09:13:13.450 回答
1

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

于 2019-10-01T11:26:09.953 回答
0

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

于 2019-10-01T07:27:18.553 回答