Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
antabis
7 лет назад

Все что было не со мной - помню.

Java до 7 версии. Операции со String и память.

В версии Java начиная с 7 эта проблема решена.

Поскольку, как я вижу, тут народ интересуется Java и даже пишет на ней ботов, хочу написать небольшую заметку на тему операций со строковым типом и особенностями распределения памяти при этом. Может кому пригодится из изучающих, это не самая очевидная особенность. Она не видна глазом и в дебаге.

Вот внизу часть кода, который работает с данными типа String. Обратим внимание на 1 и 2. Они указывают на метод String.split()

Что есть плохого в методе split()? Ничего, если у вас килотонны памяти или же вы хотите один раз разбить строку "Hello Golos" на два слова по пробелу. Но если вы сначала разбиваете огромную строку (например, список файлов в огромной папке) на отдельные строки, например их 5000 выйдет , а потом разбиваете эти подстроки (5000 штук) еще на подстроки, например, по 5 штук, то это уже напоминает проблему. И вот почему. 

String.subString() возвращает копию исходной строки, передвигая указатели на заданный символ, физически не удаляя остальное.

String.split() использует substring и в результате помещает в массив. То есть в примере выше исходная огромная строка будет 5000 раз скопирована и помещена в массив, а потом каждая из 5000 будет скопирована еще 5 раз.

Итого мы имеем до момента запуска сборщика мусора огромный кусок памяти забитый экземплярами нашей исходной строки.

Отредактировал, вставил читаемую картинку.

1
0.000 GOLOS
На Golos с September 2017
Комментарии (10)
Сортировать по:
Сначала старые