Schließen BufferedReader und InputStreamReader
Dieses Stück code ist das erstellen der memory-leak-Probleme Ursache von BufferedReader und InputStreamReader was ich denke, geschehen könnte Ursache einige Ausnahmen. Wie sollte ich es ändern?
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){
}
- Möglicherweise bewegen Sie die close () - Logik finally-block? Sind Sie sicher, dass keine Ausnahmen geschieht während des Lesens (oder) die Verbindung zu schließen?
- Habe versucht, schriftlich
e.printStackTrace()
in Ihrer catch-Klausel, um zu sehen, ob Ausnahmen geworfen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es wäre sicherer, schließen Sie Ihren stream mit einem
try..finally
block. Sie könnte auch einStringBuilder
wie es ist entworfen, für die Verkettung von strings. Sie sollten auch vermeiden, fangenException
und nichts zu tun mit es. Auch der code ist die Verkettung der Zeilen ohne Zeilenumbrüche. Dies kann auch nicht sein, was du willst, in dem Fallappend("\n")
wenn Sie Lesen, jede Zeile.Hier eine version mit den änderungen:
InputStreamReader
wie es wird automatisch geschlossen, wenn Sie in der Nähe derBufferedReader
.BufferedReader in
erklärt wird, in den Geltungsbereich destry
block und ist nicht sichtbar im Rahmenfinally
block. Die variable kann auch nicht vergeben werden, im FalleMalformedURLException
geworfen wird aus der URL-Konstruktor der Klasse.try
Blöcke. Die variablein
ist nicht definiert innerhalb dertry
block, schließt es.Der code ist nicht hübsch, aber wird nicht erstellen Sie einen Speicherverlust. Ich schlage vor, Sie verwenden einen memory-profiler, um festzustellen, wo der Speicher verwendet wird. Ansonsten sind Sie nur raten, auch wenn Sie zehn + Jahre Erfahrung in performance tuning in Java 😉
Eine bessere alternative ist die Verwendung von Java 7
Wenn Sie Java 6 oder älter, die Sie verwenden können.
in = null
und dann null in derfinally
block. Legen Sie einfach dietry
sofort, nachdem Sie konstruieren dieBufferedReader
.