2009-03-25 13 views
0

Das mag eine seltsame Frage sein, aber "try-catch" -Blöcke fügen dem Speicher in einer Serverumgebung mehr hinzu, als nur einen bestimmten Codeblock auszuführen. Wenn ich beispielsweise eine Druckstapel-Ablaufverfolgung durchführt, behält die JVM weitere Informationen bei. Oder werden mehr Informationen auf dem Heap gespeichert?Ausnahmebehandlung und Speicher

try { 
    ... do something() 
} catch(Exception e) { 
e.printStackTrace(); 
} 


... do something() 

Antwort

2

Die Ausnahme hat einen Verweis auf die Stack-Trace. printStackTrace weist mehr Speicher zu, wenn dieser Stack-Trace in etwas Hübsches formatiert wird.

Die try catch-Block führt sehr wahrscheinlich in einem weitgehend statischen Code/Datensegment, aber nicht in der Laufzeit Speicherzuordnungen

0

Der Stack-Trace wird erstellt, wenn die Ausnahme erstellt wird. Das Drucken des Stack-Trace macht nichts speicherintensiver als das Drucken von anderem.

Der try/catch-Block hat möglicherweise einen gewissen Leistungsaufwand, jedoch nicht in Form von erhöhten Speicheranforderungen.

1

Die hier wichtig ist, sobald die Ausnahme Variable ‚e‘ ist nicht mehr erreichbar (dh aus of scope) wird es für die Speichersammlung geeignet.

0

In den meisten Fällen müssen Sie sich keine Gedanken über Speicher/Leistung machen, wenn Ausnahmen auftreten. Wenn Sie eine Ausnahme haben, bei der es sich um einen gemeinsamen Codepfad handelt, wird davon ausgegangen, dass Sie Ausnahmen missbrauchen.

Wenn Ihre Frage mehr für akademische Zwecke ist, dann weiß ich nicht das volle Ausmaß dessen, was dort in Bezug auf Heap/Speicherraum vor sich geht. Joshua Bloch in "Effective Java" erwähnt jedoch, dass der catch-Block des try catch-Blocks von den meisten JVM-Implementierungen oft relativ unoptimiert ist.

0

Technisch ist die Antwort auf Ihre Frage wahrscheinlich nein. Es gibt viele Gründe, Exceptions nach Möglichkeit zu vermeiden, aber Speicher ist nicht wirklich ein Problem.

Der wahre Grund, nur Ausnahmen für wirklich außergewöhnliche Bedingungen zu werfen, ist, dass es LANGSAM ist. Das Generieren einer Ausnahme beinhaltet das sorgfältige Überprüfen des Stapels. Es ist keine schnelle Operation überhaupt. Wenn du es als Teil deiner regelmäßigen Ausführung ausführst, wird es merklich deine Geschwindigkeit beeinflussen. Ich habe einmal ein Protokollierungssystem geschrieben, das ich für äußerst schlau hielt, weil es automatisch herausfand, welche Klasse es aufgerufen hatte, indem es eine Ausnahme erzeugte und den Stapel auf diese Weise untersuchte. Irgendwann musste ich zurückgehen und diesen Teil herausnehmen, weil es alles andere merklich verlangsamte.

0

Während nicht direkt auf Speicherverbrauch bezogen, gab es einen Thread hier eine Weile zurück diskutieren How slow are the Java exceptions? Es ist meiner Meinung nach einen Blick wert.

Ich hatte auch diese link in meinen Lesezeichen. Soweit ich mich erinnern kann, gab es ein Beispiel für eine Beschleunigung, die möglich ist, wenn die Stack-Trace-Generierung beim Exception-Throw übersprungen wird, aber die Site scheint jetzt down zu sein.