Since this doesn’t cite any other work, I’ll note that Ur/Web manages memory via transactions as well. Since Ur is a pure language, and all code executes within the notion of a transaction, they can elide garbage collection overhead almost completely. A transaction starts execution with a small heap, and rolls back if it runs out of memory. When it re-runs the transaction it doubles the heap size. After a small warm-up period all of the transaction handlers will have figured out an accurate estimate of the size of their working set and won’t rollback as much. It’s a really cool idea I think, although not generally applicable.
I really appreciate the work done on Go’s garbage collector during the last few years.