在Julia释放记忆

时间:2016-07-07 20:37:20

标签: memory-management garbage-collection julia

我试图在朱莉娅释放记忆但没有成功。

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()没有释放未使用的内存? 有一些方法可以强制垃圾收集器释放吗? 为什么垃圾收集器只在第二次迭代时释放一些内存?

1 个答案:

答案 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以清除堆栈。