Laut adressiert mein Julia-Programm 14,5 GB Speicher (die Spalte "VIRT" in der Ausgabe von top
) und seine Größe im physischen Speicher beträgt 7,5 GB (die Spalte "RES"). Aber wenn ich Anrufe whos()
in meinem Programm einfügen, wird nur etwa 100 MB Speicher entfielen:Warum benutzt mein Julia-Programm so viel Speicher?
ArrayViews 190 KB Module
Base 32427 KB Module
Blosc 38 KB Module
Calculus 178 KB Module
Celeste 4034 KB Module
Compat 126 KB Module
Core 3268 KB Module
DOC 1241 bytes ASCIIString
DataArrays 936 KB Module
DataFrames 1817 KB Module
Distributions 1245 KB Module
DocOpt 221 KB Module
Docile 420 KB Module
DualNumbers 59 KB Module
FITSIO 971 KB Module
FileIO 592 KB Module
ForwardDiff 304 KB Module
GZip 588 KB Module
HDF5 2698 KB Module
JLD 335 KB Module
Logging 103 KB Module
Main 46514 KB Module
NaNMath 121 KB Module
Optim 475 KB Module
PDMats 113 KB Module
Reexport 3748 bytes Module
SortingAlgorithms 41 KB Module
StatsBase 706 KB Module
StatsFuns 289 KB Module
WCS 78 KB Module
main 8665 bytes Function
Wie kann ich herausfinden, welche Datenstrukturen, die alle Speicher mit bis? Oder warum wird keine nicht referenzierte Erinnerung freigesetzt? (Ich bin auch gc()
manchmal explizit aufrufen.)
Julia wird keine Speicher verfolgen, die in 'ccall' zugewiesen wurden, was von Bibliotheken weit verbreitet ist. Leider kann dieser Speicher auch nicht automatisch von 'gc()' gesammelt werden. (Aber Bibliotheken sollten sie freigeben, wenn ihre Datenstrukturen 'gc()' red.) –
Eine andere Datenstruktur, die in 'whos' nicht berücksichtigt wird, ist der Methodencache des gesamten JIT'-Codes. Es ist sehr schwierig zu sagen, was hier ohne den Code vor sich geht. –