Java 不使用StringBuffer可能导致内存泄漏?
以下代码是否会导致内存泄漏?使用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
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的建议是什么。但我想我的观点和你说的完全一样。。。“这里没有进行字符串操作…”