У меня есть код, протестированный в Ruby версиях 2.4 и 2.7:
1.
GC.disable
while true
?a
end
2.
GC.disable
puts ?a while true
3.
GC.disable
loop do
?a
end
4.
GC.disable
loop do
puts ?a
end
В примерах с 1 по 4 следует использовать всю доступную память и подкачку, поскольку все они создают строку a
в бесконечном l oop, такую что:
- G C отключен.
- Строка
a
не заморожена.
Но # 1 не потребляет больше байта во время выполнения. № 2, № 3 и № 4 используют как можно больше памяти. В моей системе они потребляют около 250 МБ в секунду или около того. Как и ожидалось, использование ядра процессора составляет 100%.
Почему # 1 почти не потребляет какую-либо память, в то время как другие используют всю доступную системную память за очень короткое время?