1

下面的代码会导致内存泄漏吗?使用 StringBuffer 实际上会提高内存使用率吗?

一点背景知识:一位同事一直在推动他关于内存泄漏的理论,这是他认为是问题代码的代码(没有进行任何类型的分析),他声称这会导致内存泄漏。我不同意这一点,所以我想我会把它交给其他一些开发人员以获得第三方的意见。

 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);
 }

假设 rsPartRes 是此代码中的一个 ResultSet,它可能包含 100 多条记录。基本上,他担心的是,因为我们正在循环遍历这个结果集而不使用 StringBuffer(在这种情况下,我什至不确定你将如何使用它),它可能会导致内存泄漏。是否有任何人在这里看到这可能导致内存泄漏或性能问题的情况......?

4

3 回答 3

7

据我所知,这里没有必要使用 a StringBuffer

使用 aStringBuffer来提高性能的唯一原因是当您String一遍又一遍地连接 s 时。

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

或(StringBuilder现在是更好的替代品StringBuffer

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

第二段代码的性能要好得多。

于 2009-07-22T13:30:52.240 回答
4

不,这不会导致内存泄漏。但是,在循环内声明变量会更简洁:

 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);
 }

为什么你需要这些变量甚至都不明显:

 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);
 }

(使用泛型也会更好,但那是另一回事......)

你的同事打算如何使用StringBuffer?这里没有进行字符串操作......

于 2009-07-22T13:30:13.457 回答
0

他认为泄露了什么?

不确定 StringBuilder 在这里有何帮助,因为您似乎没有建立(连接)任何字符串。除非 SomeValueObject() 内部发生了什么事

于 2009-07-22T13:32:06.467 回答