我正在尝试调试使用过多内存的程序。我已经运行了性能分析并使用了运行时选项-s -p -h -xt
。然后我使用hp2ps
绘制生成的.hp
文件:
然而,实际的内存使用量大约为650 Mb(程序在docker容器中运行,我用docker stats
看到了。
-s
选项为我提供了此输出,确认了650 Mb:
157,666,975,520 bytes allocated in the heap
311,897,256 bytes copied during GC
202,383,488 bytes maximum residency (609 sample(s))
64,558,856 bytes maximum slop
635 MB total memory in use (200 MB lost due to fragmentation)
Tot time (elapsed) Avg pause Max pause
Gen 0 301713 colls, 0 par 1.932s 1.803s 0.0000s 0.0022s
Gen 1 609 colls, 0 par 2.743s 2.694s 0.0044s 0.0104s
TASKS: 5 (1 bound, 4 peak workers (4 total), using -N1)
SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)
INIT time 0.001s ( 0.001s elapsed)
MUT time 64.448s ( 84.663s elapsed)
GC time 4.499s ( 4.320s elapsed)
RP time 0.000s ( 0.000s elapsed)
PROF time 0.176s ( 0.177s elapsed)
EXIT time 0.001s ( 0.001s elapsed)
Total time 69.137s ( 88.985s elapsed)
Alloc rate 2,446,431,692 bytes per MUT second
Productivity 93.2% of total user, 72.4% of total elapsed
gc_alloc_block_sync: 0
whitehole_spin: 0
gen[0].sync: 0
gen[1].sync: 0
阅读this post似乎使用选项-xt -hy
解决了类似的问题,但这对我没有用(并且在情节中给了我更少的信息)。我还尝试了在this,this和this问题中建议的解决方案。
我怀疑使用ByteString
的函数是负责任的,因为它使用pinned memory:
有什么想法吗?