@ararslan said, about freeing memory:
gc() multiple times.
It matches my experience that
gc() needs to be called more than once. That was also true in SBCL. But why? Isn’t it a mark-and-sweep GC? All accessible objects are kept, all others are reclaimed?
However, it turns out that
gc() only triggers a single sweep, meaning that young objects don’t get freed (just marked, I’m guessing). Doing multiple sweeps every time we manually trigger GC does a much better job of freeing stale objects leftover from previous benchmarks.
That’s interesting. Why would it mark, but not sweep? Isn’t the marking invalidated after
gc() returns, since live/dead status of objects can change immediately by changing a reference?
That’s wrong. The only reason I can think of that requires running
GC.gc() multiple times is to free objects both finalizers.