【发布时间】:2014-06-16 07:38:51
【问题描述】:
考虑一段示例代码。
public void testString()
{
int i = 0;
while(i < 100000000)
{
String s ="Hi hello bye" +i;
i++;
}
}
在每次迭代中,都会创建一个新字符串,并且下一次迭代不再需要它的值。我尝试打印之前消耗的内存并发布此 testString() 功能。以下是他们的价值观。
Before invoking testString():
Total Memory: 91684864 (87.4375 MB)
Max Memory: 1360855040 (1297.8125 MB)
Free Memory: 72163552 (68.82052612304688 MB)
After invoking testString():
Total Memory: 424280064 (404.625 MB)
Max Memory: 1360855040 (1297.8125 MB)
Free Memory: 171766816 (163.80960083007812 MB).
我看到正在使用大量内存,我担心由于当前处理字符串的方式,JVM 堆可能会超出范围。 迭代 1 生成的 String 在迭代 2 中不再需要,可以释放其存储空间。我相信这不会发生在这里。
我尝试使用 StringBuffer 和 StringBuilder 对象,但内存使用量似乎略有改善。
请帮助我更好和最佳的方法。
【问题讨论】:
-
Java 在需要之前不会进行垃圾收集。它不会垃圾收集您立即生成的每个字符串。您的测试方法实际上并没有为您提供所需的信息。
-
如果您附加字符串,编译器将默认使用
StringBuilder。所以无需显式使用它,this 一定能帮到你 -
@user3091574:那根本没有任何好处。
-
我认为您问题中的关键词是您“害怕 [the] JVM Heap 可能超出范围”。我不相信 JVM 可以在不首先运行 GC 的情况下抛出 OutOfMemory,因此对于您给出的示例,这应该是不可能的。还是你的内存真的用完了?
标签: java string performance memory-leaks jvm