字符串赋值会导致内存泄漏吗?

时间:2013-01-21 11:09:44

标签: java memory-leaks java-me

在我的J2ME代码中,我有一个看起来像这样的循环,

 Enumeration jsonEnumerator = someJSONObject.keys();

while(jsonEnumerator.hasMoreElements()){

String key = (String) jsonEnumerator.nextElement();
String value = someJSONObject.getJSONObject(key);
someOtherJson.put(value,key);
}

考虑上述代码中的字符串赋值

String key = (String) jsonEnumerator.nextElement(); 

这是使用字符串池而不是实例化新对象的正确方法,还是分配字符串以避免内存泄漏的其他方法是什么?

4 个答案:

答案 0 :(得分:2)

字符串赋值不会导致内存泄漏。

该代码中其他地方的字符串是否泄漏取决于此代码中无法识别的一些内容:

  • JSON实现如何创建键和值字符串。 (如果它在更大的String上使用String.substring(),则可能通过共享字符串后备阵列泄漏存储空间。)
  • someOtherJson是否被泄露。

正常的方法(在Java SE中)是不用担心...直到你从内存分析中得到 泄漏的证据。在Java ME实现中,内存通常更受限制,GC实现可能相对较慢。因此有必要减少对象(包括字符串)的数量和大小。但这不是内存泄漏问题......我仍然建议首先分析而不是跳入内存效率活动,这可能是浪费精力。


  

这是使用字符串池而不是实例化新对象的正确方法,还是分配字符串以避免内存泄漏的其他方法是什么?

正如我所说,上述代码中没有泄漏。

字符串池不会消除泄漏,并且它们不一定会降低垃圾对象的创建速度。他们可以在任何给定时间减少活动String对象的数量,但这需要付出代价。

如果您想尝试这种方法,最简单的方法是使用String.intern()来管理您的字符串池。但它不一定有帮助。实际上可以让事情变得更糟。 (如果没有足够的共享可能性,则实习字符串池的空间开销可能会超过保存。此外,实习字符串池会为GC创建更多工作 - 更多跟踪,以及更有效的弱引用处理。 )

答案 1 :(得分:1)

不,字符串赋值本身不会创建任何内容。 Java中唯一类似于“泄漏”的东西是当你将一大堆引用放入某个数组或其他结构中然后忘记它时 - 保持结构“实时”(可访问)但不使用它。

答案 2 :(得分:0)

如果你在谈论实习字符串,那么这里不会发生。它只会自动发生在源代码中的常量字符串中。

任何其他字符串都将被垃圾收集,就像任何其他对象一样。

答案 3 :(得分:-2)

我的建议是:

Enumeration jsonEnumerator = someJSONObject.keys();

while(jsonEnumerator.hasMoreElements()) {
    String key = (String) jsonEnumerator.nextElement();
    someOtherJson.put(someJSONObject.getJSONObject(key), key);
}

字符串实例化将导致J2ME中的内存泄漏,因为J2ME使用差的垃圾收集方法来减少资源使用。

当您尝试开发J2ME应用程序时,请注意内存和CPU使用情况。