在Julia中被内存分配和垃圾收集困惑

时间:2014-09-08 15:43:10

标签: memory-management garbage-collection julia

我对朱莉娅的记忆分配感到有些困惑。清除大变量使用的内存的know from the FAQ是通过将其设置为小(如0)然后运行gc()来完成的。

但是,我对以下内容感到有些困惑。我创建了一个随机的Float32数组:

@time A = rand(Float32, 10000, 10000);

time表示分配了大约400MB的RAM,而Julia的RAM使用量增加了400MB。这是有道理的。

然后我应用fft,但不要将结果绑定到任何变量:

@time fft(A);

time表示分配了大约800MB的RAM,而Julia的RAM使用量增加了800MB。

然而,RAM使用率仍然比开始时高1.2GB。这让我感到困惑,因为我并没有将任何变量等同于fft(A),所以我希望在fft执行后立即释放800MB的分配。

我试图运行gc,认为Julia会意识到还有800MB的RAM没有被使用:

gc();

这没有任何作用。 RAM使用率保持在~1.3GB。

但是,以下两行,

A = 0;
gc();

释放所有正在使用的1.2GB,尽管sizeof(A)只有400MB。所以我的问题是:

  • 为什么看起来像400 MB大小的对象(根据sizeof)实际上分配了1.2GB?

2 个答案:

答案 0 :(得分:10)

每个命令都会返回一些内容,即使它只是nothing。即使没有直接赋值,即使命令以分号结尾,也会为每个返回的对象分配ans

** 编辑 ** [Julia版本≥v0.7.0的更新信息]

在命令之间使用varinfo()用于Julia v0.7.0及更高版本(whos()用于Julia v0.6.4及更低版本)以监视分配和分配的空间。

答案 1 :(得分:0)

whosJulia 0.7的讨论here中已被varinfo()取代。