我试图在朱莉娅释放记忆但没有成功。
RUN git clone http://username:password@url/example.git
WORKDIR /folder
RUN make
输出:
function memuse()
return string(round(Int,parse(Int,readall(`ps -p 29563 -o rss=`))/1024),"M")
end
function test()
for i = 1:2 println("\ni=$i")
a = rand(10000,10000)
println("Created a $(memuse())")
a = 0
gc()
println("Release a $(memuse())\n")
b = rand(10000,10000)
println("Created b $(memuse())")
b = 0
gc()
println("Release b $(memuse())\n")
c = rand(10000,10000)
println("Created c $(memuse())")
c =0
gc()
println("Release c $(memuse())\n")
end
end
此代码仅需要918M才能运行,但使用的是3207M。
问题: 为什么gc()没有释放未使用的内存? 有一些方法可以强制垃圾收集器释放吗? 为什么垃圾收集器只在第二次迭代时释放一些内存?
答案 0 :(得分:5)
来自JeffBezanson的GitHub Issue
是的,这与代码的生成方式有关。
rand
调用归结为rand!(Array(T, dims))
,内部数组保留在"参数堆栈",因为这些插槽通常会被重用。在这种情况下将这些插槽清空是很好的,但必须非常小心地避免添加大量不必要的存储。
您可以像这样解决:
@noinline function wrap()
rand(10000,10000)
end
function test()
for i = 1:2 println("\ni=$i")
a = wrap()
println("Created a $(memuse())")
a = 0
gc()
println("Release a $(memuse())\n")
b = wrap()
println("Created b $(memuse())")
b = 0
gc()
println("Release b $(memuse())\n")
c = wrap()
println("Created c $(memuse())")
c =0
gc()
println("Release c $(memuse())\n")
end
end
注意@noinline
以清除堆栈。