Java input =""与input = null不同?

Hen*_*sel 6 java garbage-collection memory-management java-me

我正在运行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;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:
我仍然希望将答案标记为解决方案.我认为mmyers的言论正朝着正确的方向发展.

Bil*_*l K 11

每个变量实际上都是指向内存中"数据"的指针.

input =""将输入分配给字符串对象.它有一个长度(0)和一个空数组,以及与之相关的一些其他数据.

input.length()此时将返回0.

input = null使输入指向"无效".Null是一种特殊情况,意味着这个指针指向NOTHING,它是未分配的.

input.length()现在会抛出异常,因为你什么都不调用.length.

  • 是的,但每当有人"清空"变量时,我都会感到非常时髦.示例中的一个应该是一个方法变量,因此应该离开第二个方法退出.将它设置为null或""可能只是伤害,因为它更适合运行时进行优化.换句话说,如果input = null执行上述任何操作,则意味着输入的范围不够好 - 先修复它! (4认同)
  • 所以'null'可能比""消耗更少的内存,但两者都应该比一些巨大的字符串更好 (3认同)

Est*_*ber 5

input = null删除(让垃圾收集器删除)内存中的对象,同时input = ""实例化String包含空字符串的对象"".通过将输入设置为null,您将创建input一个空对象,因此它不会占用任何内存,而设置input ="",您将其设置为一个新对象,这肯定会占用一些内存(显然它应该是最小的).

你可以从谈论Java GC和性能来看这篇文章IBM,这会阻碍我之前的建议.它说:

显式归零只是在完成它们时将引用对象设置为null的做法.归零的想法是它通过使对象之前无法访问来协助垃圾收集器.或者至少那是理论.

有一种情况是使用显式归零不仅有用,而且实际上是必需的,并且这是对对象的引用范围比程序规范使用或认为有效的范围更广.这包括诸如使用静态或实例字段来存储对临时缓冲区的引用而不是本地变量的情况,或者使用数组来存储可以由运行时保持可访问而不是由程序的隐含语义可访问的引用.

此外,

在1997年9月的"Java开发人员连接技术提示"专栏(请参阅参考资料)中,Sun警告了这种风险并解释了在上面的pop()示例中如何需要显式的归零.不幸的是,程序员经常采用这种建议太过分,使用显式归零来帮助垃圾收集器.但在大多数情况下,它根本无法帮助垃圾收集器,在某些情况下,它实际上会损害程序的性能.

  • 但无论哪种方式,旧字符串都没有引用,因此它应该有资格收集. (8认同)
  • 与任何其他值相比,将引用变量设置为null没有什么特别之处.GC绝对不是"尽快删除"的神奇信号. (7认同)
  • 要么改变输入引用的内容,要么从垃圾收集器的角度来看它们具有相同的效果. (4认同)

nai*_*aen 5

使用StringBuffer可能是更好的方法

其中一些已在SO中得到解答:

java中的字符串构建器和stringbuffer

为什么在java中使用StringBuffer而不是字符串concantion运算符

  • 每次你写`input + = blah()`一个新的String对象被创建,旧的所有内容都被复制到附加了'blah()`的输出的内容,旧的`input`被标记为GC .这非常缓慢且效率低下.`StringBuffer`解决了它. (2认同)