簡體   English   中英

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

[![at org.postgresql.core.UTF8Encoding.decode(\[BII)Ljava/lang/String; (UTF8Encoding.java:156)
  at org.postgresql.core.Encoding.decode(\[B)Ljava/lang/String; (Encoding.java:215)
  at org.postgresql.jdbc.PgResultSet.getString(I)Ljava/lang/String; (PgResultSet.java:1926)
  at com.zaxxer.hikari.pool.HikariProxyResultSet.getString(I)Ljava/lang/String; (Unknown Source)
  at org.jooq.tools.jdbc.DefaultResultSet.getString(I)Ljava/lang/String; (DefaultResultSet.java:114)
  at org.jooq.impl.CursorImpl$CursorResultSet.getString(I)Ljava/lang/String; (CursorImpl.java:938)
  at org.jooq.impl.DefaultBinding$DefaultStringBinding.get0(Lorg/jooq/BindingGetResultSetContext;)Ljava/lang/String; (DefaultBinding.java:3334)
  at org.jooq.impl.DefaultBinding$DefaultStringBinding.get0(Lorg/jooq/BindingGetResultSetContext;)Ljava/lang/Object; (DefaultBinding.java:3270)
  at org.jooq.impl.DefaultBinding$AbstractBinding.get(Lorg/jooq/BindingGetResultSetContext;)V (DefaultBinding.java:774)
  at org.jooq.impl.CursorImpl$CursorIterator$CursorRecordInitialiser.setValue(Lorg/jooq/impl/AbstractRecord;Lorg/jooq/Field;I)V (CursorImpl.java:1771)
  at org.jooq.impl.CursorImpl$CursorIterator$CursorRecordInitialiser.operate(Lorg/jooq/impl/AbstractRecord;)Lorg/jooq/impl/AbstractRecord; (CursorImpl.java:1740)
  at org.jooq.impl.CursorImpl$CursorIterator$CursorRecordInitialiser.operate(Lorg/jooq/Record;)Lorg/jooq/Record; (CursorImpl.java:1705)
  at org.jooq.impl.RecordDelegate.operate(Lorg/jooq/impl/RecordOperation;)Lorg/jooq/Record; (RecordDelegate.java:125)
  at org.jooq.impl.CursorImpl$CursorIterator.fetchNext()Lorg/jooq/Record; (CursorImpl.java:1669)
  at org.jooq.impl.CursorImpl$CursorIterator.hasNext()Z (CursorImpl.java:1636)
  at org.jooq.impl.CursorImpl.fetchNext(I)Lorg/jooq/Result; (CursorImpl.java:408)
  at org.jooq.impl.CursorImpl.fetch(I)Lorg/jooq/Result; (CursorImpl.java:394)
  at org.jooq.impl.CursorImpl.fetch()Lorg/jooq/Result; (CursorImpl.java:301)
  at org.jooq.impl.AbstractResultQuery.execute(Lorg/jooq/ExecuteContext;Lorg/jooq/ExecuteListener;)I (AbstractResultQuery.java:297)
  at org.jooq.impl.AbstractQuery.execute()I (AbstractQuery.java:350)
  at org.jooq.impl.AbstractResultQuery.fetch()Lorg/jooq/Result; (AbstractResultQuery.java:323)
  at org.jooq.impl.AbstractResultQuery.fetchInto(Ljava/lang/Class;)Ljava/util/List; (AbstractResultQuery.java:1440)
  at org.jooq.impl.SelectImpl.fetchInto(Ljava/lang/Class;)Ljava/util/List; (SelectImpl.java:3741)
  at com.module.BuildConfigCacheManagerImpl.lambda$getAllConfigurations$3(Ljava/util/List;Lorg/jooq/DSLContext;)Ljava/util/List; (BuildConfigCacheManagerImpl.java:99)
  at com.module.BuildConfigCacheManagerImpl$$Lambda$501.apply(Ljava/lang/Object;)Ljava/lang/Object; (Unknown Source)
  at io.github.jklingsporn.vertx.jooq.classic.jdbc.JDBCClassicGenericQueryExecutor.lambda$executeAny$0(Ljava/util/function/Function;Lio/vertx/core/Future;)V (JDBCClassicGenericQueryExecutor.java:30)
  at io.github.jklingsporn.vertx.jooq.classic.jdbc.JDBCClassicGenericQueryExecutor$$Lambda$486.handle(Ljava/lang/Object;)V (Unknown Source)
  at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$2(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$$Lambda$439.run()V (Unknown Source)
  at io.vertx.core.impl.TaskQueue.run()V (TaskQueue.java:76)
  at io.vertx.core.impl.TaskQueue$$Lambda$90.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結果集的“內存泄漏”可能是由於以下三個原因之一:

  1. 大量數據被提取到客戶端。 這不會是泄漏,而只是內存使用效率低下。 可以通過ResultQuery.fetchSize()指定JDBC提取大小來解決。
  2. 您正在向客戶端獲取一個巨大的對象。 該異常由getString()調用觸發。 也許那個特定的字符串太大了而無法被獲取到內存中。 您可以使用數據類型綁定在jOOQ之上實現大型對象流邏輯。
  3. 連接池產生的代理連接無法正確關閉某些資源(例如結果集)。 在這種情況下,連接池中可能存在配置錯誤或錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM