In C, C++, Rust, Swift, &c I can determine how and when references go into or out of scope and get freed.
The defining characteristic of a garbage collected system is an active outside process with priority and control over my code that chooses when to inject bugs (to wit: arbitrary pauses) into my program outside my control.