gpt4 book ai didi

go - GC 开始时的堆大小、GC 结束时的堆大小以及来自 gctrace=1 的事件堆数代表什么?

转载 作者:IT王子 更新时间:2023-10-29 02:06:54 24 4
gpt4 key购买 nike

设置 GODEBUG=gctrace=1 会导致 Go 垃圾收集器向有关每个 GC 轮次的内部信息的标准错误发出一行。假设我有这个输出:

gc 1 @0.021s 0%: 0.15+0.37+0.25 ms clock, 3.0+0.19/0.39/0.60+5.0 ms cpu, 4->4->0 MB, 5 MB goal, 48 P
gc 2 @0.024s 0%: 0.097+0.94+0.16 ms clock, 0.29+0.21/1.3/0+0.49 ms cpu, 4->4->1 MB, 5 MB goal, 48 P
gc 3 @0.027s 1%: 0.10+0.43+0.17 ms clock, 0.60+0.48/1.5/0+1.0 ms cpu, 4->4->0 MB, 5 MB goal, 48 P
gc 4 @0.028s 1%: 0.18+0.41+0.28 ms clock, 0.18+0.69/2.0/0+0.28 ms cpu, 4->4->0 MB, 5 MB goal, 48 P
gc 5 @0.031s 1%: 0.078+0.35+0.29 ms clock, 1.1+0.26/2.0/0+4.4 ms cpu, 4->4->0 MB, 5 MB goal, 48 P
gc 6 @0.032s 1%: 0.11+0.50+0.32 ms clock, 0.22+0.99/2.3/0+0.64 ms cpu, 4->4->0 MB, 5 MB goal, 48 P
gc 7 @0.034s 1%: 0.18+0.39+0.27 ms clock, 0.18+0.56/2.2/0+0.27 ms cpu, 4->4->0 MB, 5 MB goal, 48 P
gc 8 @0.035s 2%: 0.12+0.40+0.27 ms clock, 0.12+0.63/2.2/0+0.27 ms cpu, 4->4->0 MB, 5 MB goal, 48 P
gc 9 @0.036s 2%: 0.13+0.41+0.26 ms clock, 0.13+0.52/2.2/0+0.26 ms cpu, 4->4->0 MB, 5 MB goal, 48 P
gc 10 @0.038s 2%: 0.099+0.51+0.20 ms clock, 0.19+0.56/1.9/0+0.40 ms cpu, 4->5->0 MB, 5 MB goal, 48 P
gc 11 @0.039s 2%: 0.10+0.46+0.20 ms clock, 0.10+0.23/1.3/0.005+0.20 ms cpu, 4->4->0 MB, 5 MB goal, 48 P
gc 12 @0.040s 2%: 0.066+0.46+0.24 ms clock, 0.93+0.40/1.7/0+3.4 ms cpu, 4->4->0 MB, 5 MB goal, 48 P
gc 13 @0.041s 2%: 0.099+0.30+0.20 ms clock, 0.099+0.60/1.7/0+0.20 ms cpu, 4->4->0 MB, 5 MB goal, 48 P
gc 14 @0.042s 2%: 0.095+0.45+0.24 ms clock, 0.38+0.58/2.0/0+0.98 ms cpu, 4->5->0 MB, 5 MB goal, 48 P
gc 15 @0.044s 2%: 0.095+0.45+0.21 ms clock, 1.0+0.78/1.9/0+2.3 ms cpu, 4->4->0 MB, 5 MB goal, 48 P
gc 16 @0.045s 3%: 0.10+0.45+0.23 ms clock, 0.10+0.70/2.1/0+0.23 ms cpu, 4->5->0 MB, 5 MB goal, 48 P
gc 17 @0.046s 3%: 0.088+0.40+0.17 ms clock, 0.088+0.45/1.9/0+0.17 ms cpu, 4->4->0 MB, 5 MB goal, 48 P
.
.
.
.
gc 6789 @9.998s 12%: 0.17+0.91+0.24 ms clock, 0.85+1.8/5.0/0+1.2 ms cpu, 4->6->1 MB, 6 MB goal, 48 P
gc 6790 @10.000s 12%: 0.086+0.55+0.24 ms clock, 0.78+0.30/4.2/0.043+2.2 ms cpu, 4->5->1 MB, 6 MB goal, 48 P

documention 中有这些值的定义:

gc # @#s #%: #+#+# ms clock#+#/#/#+# ms cpu, #->#-># MB, # MB goal, #P 

where the fields are as follows:
gc # the GC number, incremented at each GC
@#s time in seconds since program start
#% percentage of time spent in GC since program start
#+...+# wall-clock/CPU times for the phases of the GC
#->#-># MB heap size at GC start, at GC end, and live heap
# MB goal goal heap size
# P number of processors used

我真正感到困惑的是 #->#-># GC 开始时、GC 结束时和事件堆的 MB 堆大小

  • 在每一轮 GC 都会向操作系统释放一些未使用(垃圾)内存并且这必须减少堆大小是否正确?如果是,那么为什么堆的某些值在增加?例如:4->5->0。在 GC 开始之前,我们有 4MB 内存,包括垃圾。那么,清理垃圾后,怎么可能得到5MB的内存呢?

  • 第三个值是事件堆大小。常规堆大小有什么区别?我想它是没有垃圾的堆。

  • 如何计算目标堆大小? GC 想要在清理后达到的堆大小是否正确?那为什么这个值大于 GC 开始前的堆大小?

最佳答案

GC 每次通过都会清理一些垃圾。它不一定将它释放给操作系统(如果它认为它只需要很快再次请求它);如果是这样,操作系统不一定会回收它(直到另一个进程有内存压力,操作系统可能会将该内存分配给您的进程,以防它再次需要它)。

事件堆大小是指有多少堆正在使用中,减去任何死对象和为 future 分配准备的可用堆空间。目标堆大小是 GC 认为它需要从操作系统获取多少内存来持续处理进程的分配,而不必不断地从操作系统请求更多内存(即保持事件状态的内存量 + 在 GC 之间分配和丢弃的内存量)运行)。

GC 的目标是清理堆中的死对象,保持足够的可用堆空间来处理大多数分配,而不必从操作系统请求更多内存(这很慢),同时也不要保留过多的空闲内存(以便操作系统仍然可以分配给其他进程)。

关于go - GC 开始时的堆大小、GC 结束时的堆大小以及来自 gctrace=1 的事件堆数代表什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56044638/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com