Поведение сборки "мусора" с изолированными циклическими ссылками?

Вы должны избегать использования sed, который является линейным инструментом и плохо справляется с подобными задачами.

Если вы настаиваете на использовании sed и используете GNU sed, вы можете, однако, использовать опцию -z / --null-data, которая будет считывать весь файл за один проход (чтение записей, разделенных NUL-байтами, а не перевод строки). с разделенными записями) и позволит вам использовать шаблон )\n{, как и следовало ожидать:

$ { echo "line1)"; echo "{line2"; } | sed -z 's/)\n{/X/g'
line1Xline2

Поскольку для этого требуется загрузка всего файла в память, ожидайте ужасных результатов для огромных файлов.


Если вам нравится неуправляемая тарабарщина, вы можете решить эту проблему с помощью менее известных sed команд P, t и D:

sed '/)$/{N;s/)\n{/) {\n\ttime_exe(__func__, cl(clock()));/;t;P;D}'

Try это здесь!

Это работает, загружая дополнительную строку в пространстве образца (N), когда встречается строка, заканчивающаяся в ), пытаясь заменить образец двух строк, и печать (P) и удаление (D) первой строки из пространства шаблона, если шаблон не сопоставлен (в противном случае t переходит к следующей итерации), оставляя вторую строку в пространстве шаблона для использования в качестве первой строки следующей итерации.

Использование /first line pattern/{N;s/whole pattern/replacement/} часто достаточно хорошо, но может потерпеть неудачу, поскольку N будет использовать строку, с которой вы не будете тестировать шаблон первой строки. Это иллюстрируется здесь .

7
задан Peter Mortensen 13 October 2009 в 19:25
поделиться

3 ответа

Да, они. В основном GC идет от "известных корней" (статические переменные, локальные переменные от всех стековых фреймов в потоках alll) для нахождения объектов, которые не могут быть собраны "мусор". Если нет никакого способа добраться до объекта от корня, это имеет право на набор.

Править: Tom указал на это, которое я думал, стоило снять в сам ответ:

Технически, статические переменные не являются корнями - на них ссылаются классы, на которые ссылаются загрузчики класса, на которые ссылаются классы, на которые ссылается объект, на которые ссылаются корневые ссылки.

Различие, вероятно, будет не важно большую часть времени, но хорошо знать :)

20
ответ дан 6 December 2019 в 06:15
поделиться

Стрельба по тарелочкам на деньгах, как обычно. Я только добавил бы, что ситуация, которую Вы описываете, является причиной, что подсчет ссылок (стандартная стратегия с ранними интеллектуальными указателями C++) не используется.

4
ответ дан 6 December 2019 в 06:15
поделиться
5
ответ дан 6 December 2019 в 06:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: