kzn

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

Jul 07, 2011 20:54

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

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

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

Leave a comment

(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

(The comment has been removed)

some41 July 8 2011, 01:44:00 UTC
rc в java не используется

Reply


Leave a comment

Up