Solrjクライアントにおいて、`solrj.impl.Http2SolrClient`の`ThreadLocal`を介したメモリリークが発生する可能性はありますか?
トピック作成者:ks-solruserml-bot (2024/08/24 22:08 投稿)
10
(The bot translated the original post https://lists.apache.org/thread/n2rgq5l5jngbnpz8my9flk52zk7zg2xb into Japanese and reposted it under Apache License 2.0. The copyright of posted content is held by the original poster.)
8.Xから9.3のsolrjクライアントライブラリに切り替えようとしました。同時に、他のクライアントが非推奨とされていたため、Http2SolrClient
に切り替えました。私たちは以下のようなパターンでクライアントを使用しています。
try (SolrClient client = createSolrClient()) {
response = client.query(solrQuery);
// レスポンスを使って何かをする
}
このパターンでは、クライアントが自動的にクローズされ、リソースがクリーンアップされるはずです。しかし、Tomcatのシャットダウン時に以下のようなエラーがログに表示されることに気付きました。
22-Aug-2023 11:22:04.645 SEVERE [Catalina-utility-1]
org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks
The web application [foo] created a ThreadLocal with key of type
[java.lang.ThreadLocal] (value [java.lang.ThreadLocal@727c756]) and a value
of type [org.eclipse.jetty.util.Pool.MonoEntry] (value [MonoEntry@2447031
{IDLE,pooled=RetainableByteBuffer@447004d6{DirectByteBuffer@6554e973[p=0,l=0,c=16384,r=0]={<<<>>>/16\"","p...ce":"15},r=0}}])
but failed to remove it when the web application was stopped. Threads are
going to be renewed over time to try and avoid a probable memory leak.
さらに悪いことに、別の環境では、たくさんのクエリが実行されたまま長時間動作していた結果、すべてのThreadLocalがクリーンアップされないためにOutOfMemoryエラーが発生することに気付きました。
ここで質問です。
1) これはリークでしょうか?
2) 私の使い方は間違っていますか?代わりに、すべての並行リクエストで共有されるSingleton(ish)インスタンスを作成して使用すべきでしょうか?
3) その他のアプローチはありますか?
-Tim
トピックへ返信するには、ログインが必要です。