11

这段代码正在造成BufferedReaderInputStreamReader的内存泄漏问题,我认为这可能是一些异常的原因。我应该如何改变它?

try{
    URL url = new URL(sMyUrl);
    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
    while ((str = in.readLine()) != null) {
        jsonString += str;
    }
    in.close();
}catch(Exception e){

}
4

2 回答 2

17

使用try..finally块关闭流会更安全。您也可以使用 aStringBuilder因为它是为连接字符串而设计的。您还应该避免抓住Exception它并且什么都不做。此外,您的代码正在连接没有任何换行符的行。这很可能不是您想要的,在这种情况下append("\n"),当您阅读每一行时。

这是具有这些修改的版本:

StringBuilder json = new StringBuilder();
try {
    URL url = new URL(sMyUrl);
    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
    try {
        String str;
        while ((str = in.readLine()) != null) {
            json.append(str).append("\n");
        }
    } finally {
        in.close();
    }
} catch (Exception e) {
    throw new RuntimeException("Failed to read JSON from stream", e);
}
于 2012-08-30T14:31:54.253 回答
12

代码不是很漂亮,但不会造成内存泄漏。我建议您使用内存分析器来确定您的内存在哪里使用。否则,即使您有 10 年以上的 Java 性能调优经验,您也只是在猜测;)

更好的选择是使用 Java 7

URL url = new URL(sMyUrl);
try(BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()))) {
  while ((str = in.readLine()) != null) {
     jsonString.append(str).append("\n");
  }
}

如果您有 Java 6 或更早版本,则可以使用。

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()))) {
try {
  while ((str = in.readLine()) != null) {
     jsonString.append(str).append("\n");
  }
} finally {
  in.close();
}
于 2012-08-30T14:27:58.410 回答