?

Log in

Как [просто] получить OutOfMemoryError - Anton Kazennikov [entries|archive|friends|userinfo]
Anton Kazennikov

[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Как [просто] получить OutOfMemoryError [Jul. 7th, 2011|08:54 pm]
Anton Kazennikov
Очень легко получается, если последовательно обрабатывать много больших текстов. Схема такая:

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

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

Comments:
[User Picture]From: itman
2011-07-07 04:59 pm (UTC)
Это в каком языке?

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

И как это помогает сократить расход памяти?
(Reply) (Thread)
[User Picture]From: kzn
2011-07-07 05:08 pm (UTC)
В Java.

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

Если результат дополнительно обернуть в new String() то будет создана новая строка с новыми char[].
(Reply) (Parent) (Thread)
[User Picture]From: itman
2011-07-07 05:12 pm (UTC)
Пардон, это был глупый комментарий. Reference Counting, конечно же, существует. Неужели дополнительные offset + length приводят к исчерпанию памяти?

Edited at 2011-07-07 05:13 pm (UTC)
(Reply) (Parent) (Thread)
[User Picture]From: kzn
2011-07-07 05:21 pm (UTC)
Не, к исчерпанию памяти приводит то, что у всех строк, полученных с помощью .substring расшарен низлежащий массив символов, и поэтому в gc не попадает.

Т.е. если загрузить 1000 текстов по 100 тыс. знаков, а потом из каждого взять всего по два символа с помощью substring, то как было 200М занято, так и останется.
(Reply) (Parent) (Thread)
[User Picture]From: itman
2011-07-07 05:22 pm (UTC)
тьфу, тормоз я.
(Reply) (Parent) (Thread)
[User Picture]From: itman
2011-07-07 05:24 pm (UTC)
Кстати, RC - ужасная штука. Выигрыш от него копеечный только если ты не огромные объекты используешь, зато геморроя куча. Известный пример сишных строк в GCC. Мало того, что их реализацию больше 10 лет не могли отладить, так еще она и тормозит многопоточные приложения, потому что большинство операций со строками вызывают bus lock.
(Reply) (Parent) (Thread)
[User Picture]From: some41
2011-07-08 01:44 am (UTC)
rc в java не используется
(Reply) (Parent) (Thread)
[User Picture]From: raydac
2011-07-07 08:16 pm (UTC)
ага
(Reply) (Thread)
[User Picture]From: ens_a_se
2011-07-08 08:30 am (UTC)
Я как раз только что получил такую фигню при построении индекса в Lucene. Зашел в жж с горя - я тут про то же самое.
(Reply) (Thread)