memory - 戈朗。零垃圾传播或有效使用内存

标签 memory memory-management go garbage-collection

我时常会遇到诸如零垃圾或有效使用内存等概念。例如在知名包的特性部分 httprouter您可以看到以下内容:

Zero Garbage: The matching and dispatching process generates zero bytes of garbage. In fact, the only heap allocations that are made, is by building the slice of the key-value pairs for path parameters. If the request path contains no parameters, not a single heap allocation is necessary.

与标准库的 http.ServeMux 相比,这个包还显示了非常好的基准测试结果:

BenchmarkHttpServeMux         5000     706222 ns/op          96 B/op        6 allocs/op
BenchmarkHttpRouter         100000      15010 ns/op           0 B/op        0 allocs/op

据我了解,第二个(从表中)没有堆内存分配,每次重复的平均分配次数为零。

问题:我想了解一下内存管理的基本知识。当垃圾收集器分配/释放内存时。基准数字是什么意思(表的最后两列)以及人们如何知道堆何时分配?

我是内存管理方面的新手,所以很难理解“幕后”发生了什么。我读过的文章:

最佳答案

垃圾收集器不分配内存:-),它只是解除分配。 Go 的垃圾收集器在不断发展,详情请看设计文档 https://docs.google.com/document/d/16Y4IsnNRCN43Mx0NZc5YXZLovrHvvLhK_h0KN8woTO4/preview?sle=true并关注 golang 邮件列表上的讨论。

基准输出中的最后两列非常简单:总共分配了多少字节,以及在基准代码的一次迭代中发生了多少分配。 (此分配由您的代码完成,而不是由垃圾收集器完成)。由于任何分配都可能产生垃圾,因此减少这些数字可能是设计目标。

什么时候在堆上分配东西?每当 Go 编译器决定!编译器尝试在堆栈上分配,但有时它必须使用堆,特别是如果一个值从本地堆栈基础范围逃逸。这种逃逸分析目前正在重新进行,因此很难判断哪个值将被分配到堆或堆栈,尤其是随着编译器版本的变化。

在您的基准测试显示过多的 GC 开销之前,我不会太着迷于避免分配。

关于memory - 戈朗。零垃圾传播或有效使用内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28780543/

相关文章:

c++ - 了解 C++ 中的动态对象 ("new")

c - 为什么 Win32 HeapReAlloc() 改变值?

go - 为什么 'go vet' 只在某些版本的 Go 中报错?

pointers - 需要帮助通过 'reflect: NumField of non-struct type'

c - 如何获取指针指向的内存大小?

c++ - 删除被多个变量使用的指针

c++ - 初始化指向类实例的智能指针并访问其方法

ios - CoreData 内存开销

go - 使用proto_path运行protoc以生成Gocode时出现问题

java - Ant并行性能