I’m a bit unclear about the new v0.7 GC behaviour - I read that GC is more aggressive than on v0.6, but I failed to locate the details.
In Julia v0.7, may a local variable be GC’ed within a function if it’s not used anymore? Can a function argument be GC’ed? So, for example:
function foo()
A = rand(100)
bar(A)
# ...
# A not used from here on
# ....
end
function bar(A::Array)
# do something with A
# ...
# A not used from here on
# ....
end
Might A be GC’ed after # A not used from here on
in foo
and/or in bar
on Julia v0.7?
When do I need to use the new GC.@preserve
(assuming I need to pass a pointer to A
to some code, not necessarily via ccall
)?
Sorry if there’s already documentation on this - I’d be thankful for a pointer.
2 Likes
It can be GC:ed at any point. AFAIU only cconvert
and GC.@preserve
have special hooks into the GC to prevent objects being collected.
Thanks! Just for reference - on v0.6, A
is safe from GC at least during bar(A)
, right?
I am not sure of how clever the GC is in 0.6 but there is nothing holding A
alive so it would not be a bug to GC it inside bar
.
It’s ccall
and GC.@preserve
. cconvert
in other context is otherwise just a normal function.
2 Likes
No (if you mark the containing function @noinline
) – function arguments are always protected from GC. This (along with the new GC.@preserve
) can help when writing unsafe code which escapes from the provenance of a single ccall
(which handles gc-protection automatically).
2 Likes
Thanks, that’s good to know. Will this also be the case on v0.7/v1.0?
There are no long-term guarantees about when something can be GC’d. It will likely continue to be the case in 0.7/1.0 but it might change in any 1.x version. If you need something not to be collected, use GC.@preserve
— that’s the only thing that’s guaranteed to work. Anything else is an implementation detail.
Thanks for the clarifications!