org.postgresql.jdbc.PgResultSet 实例和 io.vertx.core.impl.VertxThread 的内存泄漏
Memory leak of org.postgresql.jdbc.PgResultSet instance and io.vertx.core.impl.VertxThread
我在我的应用程序中使用了 vert.x 和 jooq。我有一种从数据库中获取数据的方法。此方法被连续调用,但一个接一个(在另一个成功时)。一段时间后,我遇到了堆内存不足的问题。我用 Eclipse 内存分析器检查了堆转储,它显示一个对象有内存泄漏,即 org.postgresql.jdbc.PgResultSet。它显示了两个问题。第二个是线程 io.vertx.core.impl.VertxThread @ 0x680c5eb80 保留总大小为 2,246,312,920 (38.58%) 字节的局部变量。但我根据给出的提示,两者都是相关的。
以下是eclipse工具提供的stacktrace
[V (JDBCClassicGenericQueryExecutor.java:30)
at io.github.jklingsporn.vertx.jooq.classic.jdbc.JDBCClassicGenericQueryExecutor$$Lambda6.handle(Ljava/lang/Object;)V (Unknown Source)
at io.vertx.core.impl.ContextImpl.lambda$executeBlocking(Lio/vertx/core/spi/metrics/PoolMetrics;Ljava/lang/Object;Lio/vertx/core/Handler;Lio/vertx/core/Handler;)V (ContextImpl.java:272)
at io.vertx.core.impl.ContextImpl$$Lambda9.run()V (Unknown Source)
at io.vertx.core.impl.TaskQueue.run()V (TaskQueue.java:76)
at io.vertx.core.impl.TaskQueue$$Lambda.run()V (Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Ljava/util/concurrent/ThreadPoolExecutor$Worker;)V (ThreadPoolExecutor.java:1128)
at java.util.concurrent.ThreadPoolExecutor$Worker.run()V (ThreadPoolExecutor.java:628)
at io.netty.util.concurrent.FastThreadLocalRunnable.run()V (FastThreadLocalRunnable.java:30)
at java.lang.Thread.run()V (Thread.java:834)][1]][1]
谁能帮我看看这是怎么回事。
涉及 JDBC 结果集的 "memory leak" 可能是由于以下三个原因之一:
- 大量数据被提取到客户端。这不是泄漏,而是内存使用效率低下。可以通过
ResultQuery.fetchSize()
指定 JDBC 获取大小来解决
- 您正在将一个巨大的对象提取到客户端中。异常由
getString()
调用触发。也许那个特定的字符串太大而无法提取到内存中。您可以使用 data type binding 在 jOOQ 之上实现大对象流逻辑。
- 连接池生成的代理连接无法正确关闭依赖资源,例如结果集。在这种情况下,连接池可能配置错误,或存在错误。
以下是eclipse工具提供的stacktrace
[V (JDBCClassicGenericQueryExecutor.java:30)
at io.github.jklingsporn.vertx.jooq.classic.jdbc.JDBCClassicGenericQueryExecutor$$Lambda6.handle(Ljava/lang/Object;)V (Unknown Source)
at io.vertx.core.impl.ContextImpl.lambda$executeBlocking(Lio/vertx/core/spi/metrics/PoolMetrics;Ljava/lang/Object;Lio/vertx/core/Handler;Lio/vertx/core/Handler;)V (ContextImpl.java:272)
at io.vertx.core.impl.ContextImpl$$Lambda9.run()V (Unknown Source)
at io.vertx.core.impl.TaskQueue.run()V (TaskQueue.java:76)
at io.vertx.core.impl.TaskQueue$$Lambda.run()V (Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Ljava/util/concurrent/ThreadPoolExecutor$Worker;)V (ThreadPoolExecutor.java:1128)
at java.util.concurrent.ThreadPoolExecutor$Worker.run()V (ThreadPoolExecutor.java:628)
at io.netty.util.concurrent.FastThreadLocalRunnable.run()V (FastThreadLocalRunnable.java:30)
at java.lang.Thread.run()V (Thread.java:834)][1]][1]
谁能帮我看看这是怎么回事。
涉及 JDBC 结果集的 "memory leak" 可能是由于以下三个原因之一:
- 大量数据被提取到客户端。这不是泄漏,而是内存使用效率低下。可以通过
ResultQuery.fetchSize()
指定 JDBC 获取大小来解决
- 您正在将一个巨大的对象提取到客户端中。异常由
getString()
调用触发。也许那个特定的字符串太大而无法提取到内存中。您可以使用 data type binding 在 jOOQ 之上实现大对象流逻辑。 - 连接池生成的代理连接无法正确关闭依赖资源,例如结果集。在这种情况下,连接池可能配置错误,或存在错误。