2013-02-26 10 views
7

私のプログラムでは、必要に応じて一度に切断するために、いくつかのHTTPサーバーに対して開いている接続のリストを追跡する必要があります。ArrayListからURLConnectionオブジェクトを削除する<URLConnection>

私は以下の問題に直面しました。 HTTPサーバーに接続するとすべて正常に動作しますが、HTTPSの場合は接続がリストから削除されません。メモリリークを引き起こします。

例:URL指す場合

package test; 

import java.net.URL; 
import java.net.URLConnection; 
import java.util.ArrayList; 

public class Main { 

    public static void main(String[] args) { 
     try { 
      ArrayList<URLConnection> al = new ArrayList<URLConnection>(); 

      URL url = new URL("http://www.example.com"); 

      URLConnection conn = url.openConnection(); 
      al.add(conn); 
      System.out.println("Result of removing = " + al.remove(conn)); 

     } catch (Exception ex) { 
      ex.printStackTrace(System.err); 
     } 
    } 
} 

"http://www.example.com" し、 "=真除去した結果" へ。

しかし、URLが "https://www.example.com"の場合は、 "削除の結果= false"となります。

私はそのような動作を理解していません。私はいくつかの前提を持っていますが、わかりません...

誰かが助けることができますか?

答えて

6

簡潔に(少なくともHotSpot JVM 23.7-b01の場合)、URLスキームがHTTPSの場合はconn.equals(conn)==falseとなります。

操作remove(Object o)要素(o==null ? e==null : o.equals(e))の点で、すなわち除去が定義されているがに等しい)ことEように除去するようdefinedあります。要素が挿入されたばかりなので、remove(conn)は成功すると期待できますが、conn.equals(conn)falseなので、コレクション実装はその要素が含まれていないことを認識します。

これは、に等しい奇妙なケースです。反射的ではありません。 the openjdk implementationから理由は明らかです。HttpsURLConnectionImplの実装をという内部オブジェクトに委譲します。これはではなく、というラッパーです。それは本当に怒っているので

public class HttpsURLConnectionImpl { 
    protected DelegateHttpsURLConnection delegate; 
    public boolean equals(Object obj) { 
    return delegate.equals(obj); 
    } 
} 
+0

だから、それは本当に_equalsの奇妙な行動の場合である_...私はおかげで...、そのような説明を離れて送りました!ところで、あなたはそのような_equals_振る舞いを持つクラスの他の例を知りませんか? –

+0

いいえ、確かに私はこのことも知らなかった。今度思い出すことができる* equalals *の唯一の事例は、java.net.URLのものです(この場合の欠陥は整合性に関するものです:等価関係はDNS解決に依存するため、2つのURLインスタンスがそうでないかもしれません)。解決されたIPアドレスに応じて等しくなりますが、これは別の話です)。 – Javier

+0

今はすべてがクリアです。ありがとう! –

関連する問題