Рассмотрим образец кода.
public void testString()
{
int i = 0;
while(i < 100000000)
{
String s ="Hi hello bye" +i;
i++;
}
}
В каждой итерации создается новая String, и ее значение больше не требуется для следующей итерации. Я попробовал распечатать память, израсходованную pre, и опубликовать эту функцию 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 Heap может выйти за пределы из-за текущего способа обработки строк. Строка, сгенерированная для итерации 1, больше не нужна на итерации 2, и ее пространство для хранения может быть освобождено. Я считаю, что здесь этого не происходит.
Я попытался использовать объекты StringBuffer и StringBuilder, и, кажется, очень незначительное улучшение в использовании памяти.
Просьба помочь мне лучше и оптимально подойти.