Use Fiber::StackPool
in the interpreter
#14395
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
For some reason, when the GC allocates an 8 MB fiber stack in the interpreter, it might expand the heap only to find that the new pages are already black-listed, so it repeats until the system gives a good heap address. A single allocation could sometimes commit over 4 GB of memory this way.
This PR bypasses the GC entirely and allocates those fiber stacks using
mmap
orVirtualAlloc
directly, the same as non-interpreted code. It doesn't change how stack pools are used, everyCrystal::Repl::Interpreter
still maintains its own pool. Apart from making specs likechannel_spec.cr
actually finish on Windows, it looks like the interpreted stdlib specs also run slightly faster on Linux.The REPL interpreter object still uses the old allocation via
Crystal::Repl::Interpreter.new
's default argument for@stack
.