https://en.wikipedia.org/wiki/Garbage_collection_(computer_s...
Reference counting is definitely a method of garbage collection.
GC is an abstraction that can work well but can also interfere with how a developer thinks.
Yep, this is a big issue.
Another good example is copying arrays of primitive types with for loops instead of using intrisics like System.arrayCopy().
Or using lists instead of arrays.
Sure there are many situations where there is no another way other than step out of the JVM into C++, but many could be avoided with better code as well.
So if your program allocated less than available, doing nothing would be a valid GC strategy as your program never hit an upper bound in what it can allocate.
I found that an interesting way to think about the problem because it's more concerned with what GC enables instead of what it strictly does. The former is always the same, no matter the GC implementation, but the latter can vary considerably (doing nothing, reference counting, mark-and-sweep, full concurrent and compacting GC, ...).
Interestingly, this is also the description of Virtual Memory. https://en.wikipedia.org/wiki/Virtual_memory
Chapter 5.
One of the best CS references in GC algorithms.
I can post links to 70's papers if you wish, specially ones related to Lisp research.