begin, по сути, делает словарь операндом текущим словарем в стеке словарей. Все, что нужно сделать, это удалить словарь из стека.
Таким образом, 'end' не проверяет, содержит ли (например) какой-либо словарь, все еще находящийся в стеке словарей, словарь, для которого вы только что назвали end. Он также не проверяет стек операндов, чтобы определить, есть ли ссылка на словарь оттуда. И т. Д.
Это означает, что 'end' не может решить, что на словарь больше не ссылаются, поэтому он не может сбросить используемую память.
Так что ни одна из этих операций не восстанавливает память. PostScript использует модель памяти с мусором, поэтому вы не можете определить, когда будет восстановлена память. Однако сохранение сохраняет текущую память «как есть», а восстановление восстанавливает память до этой точки. Поэтому независимо от того, что происходит между сохранением и восстановлением, после восстановления память будет точно такой же, какой она была в момент сохранения. Это единственный способ быть уверенным в себе.
Точное действие сборщика мусора и сохранения / восстановления не определено в языке, достаточно того, что оно ведет себя так, как описано при выполнении операторов.
Я видел обработку памяти, реализованную различными способами в PostScript, и точное действие сохранения и восстановления значительно различается. Однако они обычно не очень «тяжелые», потому что, по сути, вы просто делаете отметку в памяти для сохранения и выбрасываете все после этой точки, когда вы делаете восстановление.
vmreclaim, с другой стороны, обычно вызывает операцию mark / sweep, чтобы проверить все объекты, выделенные в VM, чтобы увидеть, есть ли на них ссылки, и отбросить их, если нет.
Таким образом, вместо сохранения / восстановления вы можете (обычно) заменить восстановление на vmreclaim. Эффект будет примерно таким же, но для его выполнения потребуется намного больше времени.