Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符串分配会导致内存泄漏吗?_Java_Memory Leaks_Java Me - Fatal编程技术网

Java 字符串分配会导致内存泄漏吗?

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);

在我的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(); 
这是使用字符串池而不是实例化新对象的正确方法,还是分配字符串以避免内存泄漏的其他方法?

我的建议是:

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
    是否泄漏
通常的方法(在JavaSE中)是不用担心它。。。直到你从内存分析中得到证据证明存在漏洞。在JavaME实现中,内存通常受到更大的限制,而GC实现可能相对较慢。因此,有必要减少对象(包括字符串)的数量和大小。但这不是内存泄漏问题。。。我仍然建议首先进行评测,而不是跳进一场可能是浪费精力的内存效率运动


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

正如我所说,上面的代码没有漏洞

字符串池不能消除泄漏,也不一定能降低垃圾对象的创建速率。它们可以在任何给定时间减少活动字符串对象的数量,但这是有代价的


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

字符串分配不会导致内存泄漏

该代码中其他地方是否存在字符串泄漏取决于一些无法从该代码中辨别出来的东西:

  • JSON实现如何创建键和值字符串。(如果在更大的字符串上使用
    String.substring()
    ,则可能会通过共享字符串备份数组泄漏存储。)
  • someOtherJson
    是否泄漏
通常的方法(在JavaSE中)是不用担心它。。。直到你从内存分析中得到证据证明存在漏洞。在JavaME实现中,内存通常受到更大的限制,而GC实现可能相对较慢。因此,有必要减少对象(包括字符串)的数量和大小。但这不是内存泄漏问题。。。我仍然建议首先进行评测,而不是跳进一场可能是浪费精力的内存效率运动


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

正如我所说,上面的代码没有漏洞

字符串池不能消除泄漏,也不一定能降低垃圾对象的创建速率。它们可以在任何给定时间减少活动字符串对象的数量,但这是有代价的

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

如果您说的是内部字符串,那么这里就不会发生这种情况。它只对源代码中的常量字符串自动执行

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

如果您谈论的是内部字符串,那么它就不会发生在这里。它只对源代码中的常量字符串自动执行


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

不,字符串分配本身不会创建任何内容。Java中唯一类似于“泄漏”的地方是,当您将一大堆引用放入某个数组或其他结构中,然后忘记它——让结构“活动”(可访问),但不要使用它。

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

缓慢的垃圾收集器不是存储泄漏。你的版本与原始版本有何不同?简单地将字符串值分配给本地引用并不会创建新字符串。J2ME垃圾收集器并不慢。它收集垃圾的方法很差,效果也不太好。关于赋值,除了在c语言中,没有新版本的字符串