2016-07-07 67 views
4

我试图在茱莉亚发布内存,但没有成功。发布Julia中的内存

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 

输出:

i=1 
Created a 918M 
Release a 918M 

Created b 1681M 
Release b 1681M 

Created c 2444M 
Release c 2444M 


i=2 
Created a 3207M 
Release a 2444M 

Created b 3207M 
Release b 2444M 

Created c 3207M 
Release c 2444M 

此代码只需要918M运行,但使用3207M。

问题: 为什么gc()不释放未使用的内存? 有一些方法可以强制垃圾收集器释放? 为什么垃圾收集器只在第二次迭代时释放一些内存?

回答

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使堆栈被清除。

+0

你知道什么可以用来打印出OSX上的内存使用情况,因为代码'ps -p 29563 -o rss'不起作用 – zwlayer