How to reduce memory allocations in the Sieve of Eratosthenes?

It should but my 1.6.3 Base shows

function push!(a::Array{T,1}, item) where T
    # convert first so we don't grow the array if the assignment won't work
    itemT = convert(T, item)
    _growend!(a, 1)
    a[end] = itemT
    return a
end

Do I misinterpret _growend? It looks like

_growend!(a::Vector, delta::Integer) =
    ccall(:jl_array_grow_end, Cvoid, (Any, UInt), a, delta)

So the magic is happening in jl_array_grow_end?

Nevermind, just found it, yes.