kzn

Как [просто] получить OutOfMemoryError

Jul 07, 2011 20:54

Очень легко получается, если последовательно обрабатывать много больших текстов. Схема такая:

1. Получить текст
2. Вырезать нужный кусок с помощью s.substring()
3. ????
4. PROFIT!

А все потому, что для оптимизации .substring() не создает новую строку, а использует существующую.
Все это тривиально решается с помощью new String(s.substring())

Leave a comment

Comments 5

(The comment has been removed)

kzn July 7 2011, 17:08:10 UTC
В Java.

String фактически обертка над char[]. Когда делаешь s.substring(), то создается новый объект над тем же char[], только дополнительно указаны offset и length.

Если результат дополнительно обернуть в new String() то будет создана новая строка с новыми char[].

Reply

(The comment has been removed)

kzn July 7 2011, 17:21:18 UTC
Не, к исчерпанию памяти приводит то, что у всех строк, полученных с помощью .substring расшарен низлежащий массив символов, и поэтому в gc не попадает.

Т.е. если загрузить 1000 текстов по 100 тыс. знаков, а потом из каждого взять всего по два символа с помощью substring, то как было 200М занято, так и останется.

Reply


raydac July 7 2011, 20:16:20 UTC
ага

Reply


ens_a_se July 8 2011, 08:30:29 UTC
Я как раз только что получил такую фигню при построении индекса в Lucene. Зашел в жж с горя - я тут про то же самое.

Reply


Leave a comment

Up