Чтобы уточнить ответы dfan и Rafał , я потратил время на запуск обоих выражений с помощью профилировщика YourKit .
Приятно видеть JVM на работе.Первая программа настолько удобна для GC, что JVM действительно хорошо справляется с управлением ее памятью.
Я нарисовал несколько диаграмм.
GC friendly: (let [r (range 1e9)] [(firstr) (последний r)])
Эта программа выполняет очень мало памяти;в целом менее 6 мегабайт.Как указывалось ранее, он очень дружественный к GC, он делает много коллекций, но использует для этого очень мало ЦП.
Держатель головки: (let [r (range 1e9)] [(last r) (firstr)])
Этот файл очень требователен к памяти.Он занимает до 300 МБ ОЗУ, но этого недостаточно, и программа не завершает работу (JVM умирает менее чем через минуту).GC отнимает до 90% процессорного времени, что указывает на то, что он отчаянно пытается освободить любую память, которую может, но не может ее найти (собранные объекты очень малы или отсутствуют).
Edit Вторая программа исчерпала память, что вызвало дамп кучи.Анализ этого дампа показывает, что 70% памяти составляют объекты java.lang.Integer, которые не могут быть собраны.Вот еще один скриншот: