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.
input = null删除(让垃圾收集器删除)内存中的对象,同时input = ""实例化String包含空字符串的对象"".通过将输入设置为null,您将创建input一个空对象,因此它不会占用任何内存,而设置input ="",您将其设置为一个新对象,这肯定会占用一些内存(显然它应该是最小的).
你可以从谈论Java GC和性能来看这篇文章IBM,这会阻碍我之前的建议.它说:
显式归零只是在完成它们时将引用对象设置为null的做法.归零的想法是它通过使对象之前无法访问来协助垃圾收集器.或者至少那是理论.
有一种情况是使用显式归零不仅有用,而且实际上是必需的,并且这是对对象的引用范围比程序规范使用或认为有效的范围更广.这包括诸如使用静态或实例字段来存储对临时缓冲区的引用而不是本地变量的情况,或者使用数组来存储可以由运行时保持可访问而不是由程序的隐含语义可访问的引用.
此外,
在1997年9月的"Java开发人员连接技术提示"专栏(请参阅参考资料)中,Sun警告了这种风险并解释了在上面的pop()示例中如何需要显式的归零.不幸的是,程序员经常采用这种建议太过分,使用显式归零来帮助垃圾收集器.但在大多数情况下,它根本无法帮助垃圾收集器,在某些情况下,它实际上会损害程序的性能.
使用StringBuffer可能是更好的方法
其中一些已在SO中得到解答:
为什么在java中使用StringBuffer而不是字符串concantion运算符
| 归档时间: |
|
| 查看次数: |
4208 次 |
| 最近记录: |