我正在运行一个J2ME应用程序,遇到了一些严重的内存问题。
因此,我构建了另一个步骤来清除巨大的输入字符串,并处理它的数据并清除它。但是直到我设置input = null而不是input = "".,它才解决了这个问题。
在内存管理方面不应该是一样的吗?谁能给我解释一下区别吗?
谢谢,
rAyt
for(int x = 0; x <= ChunksPartCount; x++)
{
_model.setLoading_bar_progress((x * ChunkSize));
input += web_service.FullCompanyListChunksGet(x, ChunkSize);
if((x * ChunkSize) > 5000)
{
ReadXML(input);
input = null;
}
}编辑:
我还是想指出答案是解决之道。我认为先生们的发言方向是正确的。
发布于 2009-07-24 18:35:15
每个变量实际上都是一个指向内存中“数据”的指针。
input = "“将输入分配给string对象。它有一个长度(0)和一个空数组,以及一些其他与它相关的数据。
此时,input.length()将返回0。
input = null使输入指向“无效”。Null是一种特殊情况,它意味着这个指针没有指向任何东西,它没有赋值。
input.length()现在将抛出一个异常,因为您没有调用.length。
发布于 2009-07-24 18:29:55
input = null删除内存中的对象(让垃圾回收器删除),而input = ""实例化包含空字符串""的String对象。通过将输入设置为null,您将使input成为一个空对象,因此它不会占用任何内存,而在设置input = "“时,您将它设置为一个新对象,这肯定会占用一些内存(显然应该是最小的)。
您可以从这篇文章讨论Java和性能来查看IBM,这使我以前的建议望而却步。上面写着:
显式赋值只是在完成引用对象时将其设置为null的做法。明暗化背后的思想是,它帮助垃圾收集器使对象更早地不可访问。或者至少这就是理论。 有一种情况是,使用显式赋值不仅是有用的,而且实际上是必需的,在这种情况下,对对象的引用的作用域比程序规范使用或认为有效的范围更广。包括使用静态或实例字段来存储对临时缓冲区的引用,而不是使用局部变量,或者使用数组存储运行时可能仍然可以访问的引用,而不是程序的隐含语义。
而且,
在1997年9月的"Java开发人员连接技术提示“专栏(请参阅参考资料)中,Sun警告了这种风险,并解释了在上面的pop()示例中如何需要显式赋值。不幸的是,程序员经常使用显式的空值来帮助垃圾收集器。,但在大多数情况下,它并不能帮助垃圾收集器在所有,在某些情况下,它实际上会损害程序的性能。
发布于 2009-07-24 18:34:37
使用StringBuffer可能是更好的方法
这里已经回答了其中的一些问题:
https://stackoverflow.com/questions/1179346
复制相似问题