我有一个独立的应用程序,其中似乎有与https url连接相关的内存泄漏。它基本上是一个使用URLConnection发布到站点的while循环。当我进行堆转储时,我可以看到成千上万的实例:
java.net.URL;
sun.net.wwww.protocol.https.DelegateHttpsURLConnection;
sun.net.wwww.protocol.https.HttpsURLConnectionImpl;
因此看起来应用程序自启动以来已经泄露的每个连接。我的应用程序的代码框架如下所示:
while (true) {
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setFixedLengthStreamingMode(...);
conn.setRequestMethod("POST");
OutputStream out = conn.getOutputStream();
try {
out.write(bytes);
} finally {
out.close();
}
}
连接代码实际上来自谷歌的推送通知服务库(将其归结为他们正在做的事情),完整代码在这里:
所以它更像是:
import com.google.android.gcm.server.Sender;
import com.google.android.gcm.server.Message;
while (true) {
Sender sender = new Sender(...);
sender.sendNoRetry(new Message(...));
}
我认为这是我平台的一个问题 - 我在Windows机器上运行这个相同的应用程序并且没有问题。我还有一些其他类似的应用程序只是发布到一个网址并关闭他们的流,他们也以同样的方式耗尽内存。我还没有在它们上捕获任何堆转储,只是意识到连接泄漏可能是所有它们的常见问题。
我在Ubuntu上使用jdk 1.6.0_30。
是否有我遗漏的东西,是否有某种java ssl会话缓存需要显式清理等?
谢谢