Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不使用StringBuffer可能导致内存泄漏?_Java_Memory Management_Jdbc_Memory Leaks_Resultset - Fatal编程技术网

Java 不使用StringBuffer可能导致内存泄漏?

Java 不使用StringBuffer可能导致内存泄漏?,java,memory-management,jdbc,memory-leaks,resultset,Java,Memory Management,Jdbc,Memory Leaks,Resultset,以下代码是否会导致内存泄漏?使用StringBuffer会提高内存使用率吗 一点背景:一位同事一直在推广他关于内存泄漏的理论,这是他认定为问题代码的代码(没有进行任何形式的分析),他声称这可能导致内存泄漏。我不同意这一点,所以我想我应该把它交给其他一些开发者,以获得第三方的意见 List partCollection = new ArrayList() String partKeyID = null; String sPartNbr = null; String partDescrip

以下代码是否会导致内存泄漏?使用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(在本例中,我甚至不知道如何使用它),所以它可能会导致内存泄漏。有没有人在这里看到过这样的情况,可能会导致内存泄漏或性能问题…?

没有,这不会导致内存泄漏。但是,在循环中声明变量会更干净:

 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
?这里没有字符串操作…

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

 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
?这里没有字符串操作…

据我所知,这里不需要使用
StringBuffer

使用
StringBuffer
来提高性能的唯一原因是在反复连接
String
s时

String result = "";
while (condition) {
    result += somethingElse;
}
或者(
StringBuilder
是当今
StringBuffer
的更好替代品)


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

据我所知,这里不需要使用
StringBuffer

使用
StringBuffer
来提高性能的唯一原因是在反复连接
String
s时

String result = "";
while (condition) {
    result += somethingElse;
}
或者(
StringBuilder
是当今
StringBuffer
的更好替代品)


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

他认为泄漏了什么


不确定StringBuilder在这里有何帮助,因为您似乎没有构建(连接)任何字符串。除非在SomeValueObject()中发生了什么事情,否则他认为泄漏了什么


不确定StringBuilder在这里有何帮助,因为您似乎没有构建(连接)任何字符串。除非SomeValueObject()内部发生了什么事情,否则这是从DB代码块中提取的相当标准的JDBC对象。当然,假设之后有一个rsPartRes.close()和一个psPartRes.close()(您使用的PreparedStatement)。您能发布SomeValueObject代码吗,这是唯一可以查找内存泄漏的地方?SomeValueObject是一个假设对象,但它纯粹是一个Bean。不,这是从DB代码块中提取的相当标准的JDBC对象。假设之后有一个rsPartRes.close()和一个psPartRes.close()(您使用的PreparedStatement),当然。你能发布SomeValueObject代码吗?这是唯一可以查找内存泄漏的地方?SomeValueObject是一个假设的对象,但它纯粹是一个Bean。我想在他们的代码库中的其他地方有一些代码使用了这个列表,StringBuffer/StringBuilder是否工作,可能是在一个网页表中。当然,这应该在JSP中完成……我将此标记为已接受的答案。我想我要寻找的答案是,除非没有浓缩或严重的字符串操作,否则就没有必要使用StringBuffer。我想象在他们的代码库中的其他地方,有一些代码使用这个列表,并执行StringBuffer/StringBuilder工作,可能是一个网页表。当然,这应该在JSP中完成……我将此标记为已接受的答案。我想我要寻找的答案是,除非没有浓缩或严重的字符串操作,否则就不需要StringBuffer。Jon,同意你的编码建议。我不完全确定StringBuffer的建议是什么。但我想我的观点和你说的完全一样。。。“这里没有字符串操作……”Jon同意你的编码建议。我不完全确定StringBuffer的建议是什么。但我想我的观点和你说的完全一样。。。“这里没有进行字符串操作…”