Java 字符串分配会导致内存泄漏吗?
在我的J2ME代码中,我有一个如下所示的循环Java 字符串分配会导致内存泄漏吗?,java,memory-leaks,java-me,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);
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();
这是使用字符串池而不是实例化新对象的正确方法,还是分配字符串以避免内存泄漏的其他方法?我的建议是:
Enumeration jsonEnumerator = someJSONObject.keys();
while(jsonEnumerator.hasMoreElements()) {
String key = (String) jsonEnumerator.nextElement();
someOtherJson.put(someJSONObject.getJSONObject(key), key);
}
字符串实例化将导致J2ME内存泄漏,因为J2ME使用了一种糟糕的垃圾收集方法来减少资源使用
当您尝试开发J2ME应用程序时,请注意内存和CPU使用。我的建议是:
Enumeration jsonEnumerator = someJSONObject.keys();
while(jsonEnumerator.hasMoreElements()) {
String key = (String) jsonEnumerator.nextElement();
someOtherJson.put(someJSONObject.getJSONObject(key), key);
}
字符串实例化将导致J2ME内存泄漏,因为J2ME使用了一种糟糕的垃圾收集方法来减少资源使用
当您尝试开发J2ME应用程序时,请注意内存和CPU使用。字符串分配不会导致内存泄漏 该代码中其他地方是否存在字符串泄漏取决于一些无法从该代码中辨别出来的东西:
- JSON实现如何创建键和值字符串。(如果在更大的字符串上使用
,则可能会通过共享字符串备份数组泄漏存储。)String.substring()
是否泄漏someOtherJson
这是使用字符串池而不是实例化新对象的正确方法,还是其他可以避免内存泄漏的分配字符串的方法 正如我所说,上面的代码没有漏洞 字符串池不能消除泄漏,也不一定能降低垃圾对象的创建速率。它们可以在任何给定时间减少活动字符串对象的数量,但这是有代价的
如果您想尝试这种方法,最简单的方法是使用
String.intern()
来管理字符串池。但这未必有帮助。事实上会让事情变得更糟。(如果没有足够的共享潜力,则内部字符串池的空间开销可能超过节省的空间。此外,内部字符串池为GC创建了更多的工作-更多的跟踪,以及更有效地处理弱引用。)字符串分配不会导致内存泄漏
该代码中其他地方是否存在字符串泄漏取决于一些无法从该代码中辨别出来的东西:
- JSON实现如何创建键和值字符串。(如果在更大的字符串上使用
,则可能会通过共享字符串备份数组泄漏存储。)String.substring()
是否泄漏someOtherJson
这是使用字符串池而不是实例化新对象的正确方法,还是其他可以避免内存泄漏的分配字符串的方法 正如我所说,上面的代码没有漏洞 字符串池不能消除泄漏,也不一定能降低垃圾对象的创建速率。它们可以在任何给定时间减少活动字符串对象的数量,但这是有代价的 如果您想尝试这种方法,最简单的方法是使用
String.intern()
来管理字符串池。但这未必有帮助。事实上会让事情变得更糟。(如果没有足够的共享潜力,则内部字符串池的空间开销可能会超过节省的空间。此外,内部字符串池为GC创建了更多的工作-更多的跟踪,以及更有效的弱引用来处理。)如果您说的是内部字符串,那么这里就不会发生这种情况。它只对源代码中的常量字符串自动执行
任何其他字符串都将被垃圾收集,就像任何其他对象一样。如果您谈论的是内部字符串,那么它就不会发生在这里。它只对源代码中的常量字符串自动执行
任何其他字符串都将被垃圾收集,就像任何其他对象一样。不,字符串分配本身不会创建任何内容。Java中唯一类似于“泄漏”的地方是,当您将一大堆引用放入某个数组或其他结构中,然后忘记它——让结构“活动”(可访问),但不要使用它。不,字符串赋值本身不会创建任何内容。Java中唯一类似于“泄漏”的地方是,当你将一大堆引用放入某个数组或其他结构中,然后忘记它——让结构保持“活动”(可访问),但不要使用它。缓慢的垃圾收集器不是存储泄漏。你的版本与原始版本有何不同?简单地将字符串值分配给本地引用并不会创建新字符串。J2ME垃圾收集器并不慢。它收集垃圾的方法很差,效果也不太好。关于赋值,除了在c语言中,没有新版本的字符串