Haskell探查器发现内存使用太少

Haskell探查器发现内存使用太少,haskell,memory,profiling,bytestring,memory-profiling,Haskell,Memory,Profiling,Bytestring,Memory Profiling,我正在调试一个占用太多内存的程序。我已经运行了评测并使用运行时选项-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

我正在调试一个占用太多内存的程序。我已经运行了评测并使用运行时选项
-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
阅读它时,似乎使用选项
-xt-hy
解决了类似的问题,但这对我不起作用(并且在绘图中给了我更少的信息)。我还尝试了在和问题中建议的解决方案

我怀疑使用
ByteString
的函数应该负责,因为它使用:


有什么想法吗?

配置文件上说
202383488字节的最大驻留时间
,这意味着您的程序在其生命周期内的任何给定时刻都没有使用超过202MB的内存(在我看来,最后的小峰值几乎是正确的)。
635 MB的总使用内存
再次指的是最大值(不是总内存!!)-具体而言,是操作系统分配给程序的最大内存量。.hp图仅测量GC知道的内存-如果GC占用了一些内存,但操作系统尚未回收,则会在例如
docker stats
中看到更高的内存使用率。该图对操作系统工具报告驻留的原因给出了一些解释太长了,读不下去了,这是分析器做的工作(试图消除你在程序中无法控制和不能影响的内存分配源,也就是垃圾收集程序,运行时本身)。我不确定我是否明白这里的问题是什么。是202吗≠ 635?这些数字衡量的是不同的东西,通常也会有所不同。有关更多讨论,请参阅最近的问题:@ReidBarton You's right,我把这两个数字混在一起了。还有从docker统计数据中测得的内存量——大约650 Mb,巧合的是——但user2407038对这个数字大的原因有一些评论R