由于没有使用StringBuffer可能导致内存泄漏?

时间:2009-07-22 13:28:54

标签: java memory-management jdbc memory-leaks resultset

以下代码是否会导致内存泄漏?使用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(在这种情况下,我甚至不确定你将如何使用它),它可能导致内存泄漏。是否有人在这里看到这可能导致内存泄漏或性能问题......?

3 个答案:

答案 0 :(得分:7)

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

使用StringBuffer提高效果的唯一原因是,当您一遍又一遍地连接String时。

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

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

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

第二段代码表现得更好。

答案 1 :(得分: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?这里没有字符串操作...

答案 2 :(得分:0)

他认为泄漏了什么?

不确定StringBuilder如何帮助,因为您似乎没有构建(连接)任何字符串。除非SomeValueObject()

内部发生了什么