Alloc.jl makes Julia's memory allocator customisable. Currently it provides the ability to bump allocate everything within a block of code.
julia> using IRTools
julia> using Alloc: Buffer, run, profile
julia> function f()
x = rand(100, 100)
y = rand(100)
x*y
end
f (generic function with 1 method)
julia> @allocated f()
81872
julia> profile(f); # Figure out how big our buffer should be
[ Info: Allocated 81600 bytes
julia> const buf = Buffer(10^6);
julia> @allocated run(f, buf)
1280
The bump allocator has the downside that no memory is ever freed until f
is finished. The advantage is that allocation is really fast (effectively the same as stack allocation of arrays), so if your memory usage is reasonably predictable you can just bump allocate within your main loop.