# Running GC.gc() multiple times

**URL:** <https://discourse.julialang.org/t/running-gc-gc-multiple-times/20229>\
**Category:** General Usage\
**Created:** [January 29, 2019, 11:28am UTC](https://discourse.julialang.org/t/running-gc-gc-multiple-times/20229 "2019-01-29T11:28:13Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![cstjean](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cstjean/32/1444_2.png) [@cstjean](https://discourse.julialang.org/u/cstjean)\
**Post date:** [January 29, 2019, 11:28am UTC](https://discourse.julialang.org/t/running-gc-gc-multiple-times/20229/1 "2019-01-29T11:28:13Z")

</div>

@ararslan said, about freeing memory:

> Try running `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?

---

<div class="post-metadata">

**Author:** ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)\
**Post date:** [January 29, 2019, 11:34am UTC](https://discourse.julialang.org/t/running-gc-gc-multiple-times/20229/2 "2019-01-29T11:34:41Z")

</div>

Ref [Trigger multiple GC sweeps between samples/trials instead of a single sweep by jrevels · Pull Request #22 · JuliaCI/BenchmarkTools.jl · GitHub](https://github.com/JuliaCI/BenchmarkTools.jl/pull/22)

---

<div class="post-metadata">

**Author:** ![cstjean](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cstjean/32/1444_2.png) [@cstjean](https://discourse.julialang.org/u/cstjean)\
**Post date:** [January 29, 2019, 11:43am UTC](https://discourse.julialang.org/t/running-gc-gc-multiple-times/20229/3 "2019-01-29T11:43:05Z")

</div>

> 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?

---

<div class="post-metadata">

**Author:** ![yuyichao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yuyichao/32/20_2.png) [@yuyichao](https://discourse.julialang.org/u/yuyichao)\
**Post date:** [January 29, 2019, 11:51am UTC](https://discourse.julialang.org/t/running-gc-gc-multiple-times/20229/4 "2019-01-29T11:51:51Z")

</div>

That’s wrong. The only reason I can think of that requires running `GC.gc()` multiple times is to free objects both finalizers.
