Frage

Kann der folgende Code verursacht ein Speicherleck? Würde mit einem String verbessern tatsächlich die Speichernutzung?

Ein wenig Hintergrund: Ein Mitarbeiter hat seine Theorien über Speicherlecks drängen, und das ist Code, den er als Problemcode identifiziert hat (ohne jede Art von Profilierung zu tun), die er behauptet, einen Speicherverlust verursachen kann. Ich bin nicht einverstanden mit diesem, so dass ich dachte, dass ich es zu einigen anderen Entwicklern gestellt habe eine Dritte Stellungnahme zu erhalten.

 List partCollection = new ArrayList()

 String partKeyID = null;
 String sPartNbr = null;
 String partDescription = null; 

 while(rsPartRes.next())
 {
        partKeyID = rsPartRes.getString("PART_KEY_ID"); 
        sPartNbr = rsPartRes.getString("PART_NBR"); 
        partDescription = rsPartRes.getString("PART_DESC");

        SomeValueObject someValueObject = new SomeValueObject();
        someValueObject.setPartKeyID(partKeyID);
        someValueObject.setSPartNbr(sPartNbr);
        someValueObject.setPartDescription(partDescription);

        partCollection.add(someValueObject);
 }

Nehmen wir an, rsPartRes ein ResultSet in diesem Code ist die mehr als 100 Datensätze enthalten könnte. Im Grunde genommen seine Sorge ist, dass, weil wir durch diese Ergebnismenge Looping und kein String mit (was in diesem Fall, ich bin nicht einmal sicher, wie Sie eine solche verwenden würden), dass es Speicherlecks verursachen könnte. Gibt es einen Fall, dass jemand sieht hier, wo dies möglicherweise Speicherlecks oder Performance-Probleme verursachen könnte ...?

War es hilfreich?

Lösung

Soweit ich das beurteilen kann, gibt es keine Notwendigkeit hier eine StringBuffer zu verwenden.

Der einzige Grund, einen StringBuffer zu verwenden, um Leistung zu erhöhen, wenn Sie Strings immer und immer sind verketten.

String result = "";
while (condition) {
    result += somethingElse;
}

oder (StringBuilder ist ein besserer Ersatz für StringBuffer in diesen Tagen)

StringBuilder result = new StringBuilder();
while (condition) {
    result.append(somethingElse);
}

Der zweite Teil des Codes führt viel besser.

Andere Tipps

Nein, das wird nicht ein Speicherleck verursachen. Allerdings wäre es sauberer sein, die Variablen innerhalb der Schleife zu deklarieren:

 List partCollection = new ArrayList();

 while(rsPartRes.next())
 {
     String partKeyID = rsPartRes.getString("PART_KEY_ID"); 
     String sPartNbr = rsPartRes.getString("PART_NBR"); 
     String partDescription = rsPartRes.getString("PART_DESC");

     SomeValueObject someValueObject = new SomeValueObject();
     someValueObject.setPartKeyID(partKeyID);
     someValueObject.setSPartNbr(sPartNbr);
     someValueObject.setPartDescription(partDescription);

     partCollection.add(someValueObject);
 }

Es ist nicht einmal klar, warum Sie diese Variablen überhaupt benötigen:

 while(rsPartRes.next())
 {
     SomeValueObject someValueObject = new SomeValueObject();
     someValueObject.setPartKeyID(rsPartRes.getString("PART_KEY_ID"));
     someValueObject.setSPartNbr(rsPartRes.getString("PART_NBR"));
     someValueObject.setPartDescription(rsPartRes.getString("PART_DESC"));

     partCollection.add(someValueObject);
 }

(Es wäre auch schöner sein Generika zu verwenden, aber das ist eine andere Sache ...)

Wie war Ihr Kollege Planung StringBuffer zu benutzen? Es gibt keine Manipulation String geht hier ...

Was denkt er undicht ist?

Nicht sicher, wie Stringbuilder hilft hier, da Sie scheinen alle Saiten nicht zu sein Aufbau (verketten). Es sei denn, es ist etwas in SomeValueObject los ()

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top