# Finalizers not running

**URL:** https://discourse.julialang.org/t/finalizers-not-running/2266
**Category:** General Usage
**Created:** [February 24, 2017, 7:48am UTC](https://discourse.julialang.org/t/finalizers-not-running/2266 "2017-02-24T07:48:38Z")
**Posts on this page:** 7
**Page:** 1

<div class="post-metadata">

### Author: ![maleadt](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/maleadt/32/10097_2.png) [@maleadt](https://discourse.julialang.org/u/maleadt)
#### Post date: [February 24, 2017, 7:48am UTC](https://discourse.julialang.org/t/finalizers-not-running/2266/1 "2017-02-24T07:48:38Z")

</div>

I’m having some trouble getting finalizers to run, it seems that in some cases finalizers are only run `atexit`, and not when the object seems unreachable and I’ve called `gc()` a couple of times.

For example, the following snippet works as expected:

```julia
type Foo
    field
    function Foo()
        obj = new(1)
        finalizer(obj, finalize)
        return obj
    end
end

finalized = false
function finalize(obj::Foo)
    global finalized
    finalized = true
    msg = "Finalizing...\n"
    ccall(:write, Cssize_t, (Cint, Cstring, Csize_t),
          1, msg, length(msg))
end

let
    foo = Foo()
end

println("Forcing GC")
for i in 1:10
    gc()
end
@assert finalized

```

However, if I change `Foo` _not_ to have any fields, the finalizer isn’t run before the program exits:

```julia
type Foo
    function Foo()
        obj = new()
        finalizer(obj, finalize)
        return obj
    end
end

...

ERROR: LoadError: AssertionError: finalized
Finalizing...

```

Another one, again starting from the top example from this post (ie. with `field`) but this time throwing a `MethodError` refering to an instance of `foo`:

```julia
let
    foo = Foo()
    @test_throws MethodError sin(foo)
end

...

ERROR: LoadError: AssertionError: finalized
Finalizing...

```

Are these genuine bugs, or am I expecting something from the gc which it can’t/doesn’t guarantee?

cc @yuyichao

---

<div class="post-metadata">

### Author: ![jameson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jameson/32/23_2.png) [@jameson](https://discourse.julialang.org/u/jameson)
#### Post date: [February 24, 2017, 12:53pm UTC](https://discourse.julialang.org/t/finalizers-not-running/2266/2 "2017-02-24T12:53:21Z")

</div>

Objects without fields (otherwise known as singletons) are never allocated, so they never need to be freed.

---

<div class="post-metadata">

### Author: ![maleadt](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/maleadt/32/10097_2.png) [@maleadt](https://discourse.julialang.org/u/maleadt)
#### Post date: [February 24, 2017, 1:02pm UTC](https://discourse.julialang.org/t/finalizers-not-running/2266/3 "2017-02-24T13:02:13Z")

</div>

I suspected it would be something like that. The second issue is the realistic one though, where GPU array finalizers aren’t run and hence memory isn’t freed.

---

<div class="post-metadata">

### Author: ![jameson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jameson/32/23_2.png) [@jameson](https://discourse.julialang.org/u/jameson)
#### Post date: [February 24, 2017, 1:12pm UTC](https://discourse.julialang.org/t/finalizers-not-running/2266/4 "2017-02-24T13:12:17Z")

</div>

I’m guessing that `@test_throws` is creating a new function (rather than a closure) over the variable `foo` since it sees that it is as the toplevel scope. This is perhaps a lowering bug, but one that exists for compatibility with existing code.

---

<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: [February 24, 2017, 1:43pm UTC](https://discourse.julialang.org/t/finalizers-not-running/2266/5 "2017-02-24T13:43:02Z")

</div>

For the second case, it was kept alive in `exception_in_transit`.

---

<div class="post-metadata">

### Author: ![maleadt](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/maleadt/32/10097_2.png) [@maleadt](https://discourse.julialang.org/u/maleadt)
#### Post date: [February 24, 2017, 1:51pm UTC](https://discourse.julialang.org/t/finalizers-not-running/2266/6 "2017-02-24T13:51:12Z")

</div>

Ah, yes, I had just reduced it to `throw(foo)`… Thanks.

---

<div class="post-metadata">

### Author: ![jameson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jameson/32/23_2.png) [@jameson](https://discourse.julialang.org/u/jameson)
#### Post date: [February 24, 2017, 4:03pm UTC](https://discourse.julialang.org/t/finalizers-not-running/2266/7 "2017-02-24T16:03:16Z")

</div>

ah, ok, so it is a bug (submitted [https://github.com/JuliaLang/julia/issues/20784](https://github.com/JuliaLang/julia/issues/20784))
