当前位置: 首页 > 面试题库 >

如何在Go中最小化垃圾回收?

芮叶秋
2023-03-14
问题内容

有时您可能想要避免/最小化垃圾收集器,因此我想确定如何做。

我认为下一个是正确的:

  • 在函数的开头声明变量。
  • 使用数组而不是切片。

还有吗


问题答案:

避免垃圾相对简单。您需要了解在哪里进行分配,并查看是否可以避免分配。

首先,在函数开头声明变量将无济于事。编译器不知道区别。但是,人类会知道其中的区别,并且会惹恼他们。

使用数组而不是切片将是可行的,但这是因为将数组(除非取消引用)放置在堆栈中。数组还有其他问题,例如在函数之间按值(复制)传递数组。堆栈上的所有内容都不是“垃圾”,因为当函数返回时它将被释放。任何可能逃避该函数的指针或切片都会放在堆上,垃圾回收器必须在某些时候处理该堆。

您可以做的最好的事情就是避免分配。用完不需要的大量数据后,请重新使用它们。这是Go博客上的性能分析教程中使用的方法。我建议阅读。

除了概要分析教程中的示例外,还有另一个示例:假设您有一个[]int名为的类型切片xs。您将不断添加到,[]int直到达到条件,然后将其重置,以便重新开始。如果这样做xs = nil,则现在将切片的基础数组声明为要收集的垃圾。然后,Append将在您下次使用它时重新分配xs。相反xs = xs[:0],如果您这样做,则仍在重置它,但保留旧数组

在大多数情况下,避免产生垃圾是过早的优化。对于大多数代码而言,这无关紧要。但是您可能偶尔会发现一个函数,该函数被调用很多次,每次运行时分配很多。或者是一个循环,您可以重新分配而不是重复使用。我会等到你看到瓶颈后再着手。



 类似资料:
  • 问题内容: 即使很棘手,也可以在Java中强制进行垃圾回收吗?我知道;,;但是他们只建议做GC。我该如何强制GC? 问题答案: 最好的选择是调用,这只是向垃圾收集器提示你要它进行收集。由于垃圾收集器是不确定的,因此无法强制立即收集。

  • 问题内容: 我有一个名为的文件,该文件引用了另一个仅包含函数且在循环中使用的文件。这些功能具有不同的优化功能。 然后,这将引用另外两个仅包含函数的相似文件,这些文件处于循环中。所有这些文件都使用numpy。 我认为这是因为函数调用循环并在numpy中创建数组导致了内存过载。因此,我无法完成一些优化算法,也无法遍历我想要的所有可能的坐标。 如何确保删除numpy中的变量?据我了解,numpy的C库使

  • Go语言自带垃圾回收机制(GC)。GC 通过独立的进程执行,它会搜索不再使用的变量,并将其释放。需要注意的是,GC 在运行时会占用机器资源。 GC 是自动进行的,如果要手动进行 GC,可以使用 runtime.GC() 函数,显式的执行 GC。显式的进行 GC 只在某些特殊的情况下才有用,比如当内存资源不足时调用 runtime.GC() ,这样会立即释放一大片内存,但是会造成程序短时间的性能下降

  • 垃圾回收 我们对生产中花了很多时间来调整垃圾回收。垃圾回收的关注点与Java大致相似,尽管一些惯用的Scala代码比起惯用的Java代码会容易产生更多(短暂的)垃圾——函数式风格的副产品。Hotspot的分代垃圾收集通常使这不成问题,因为短暂的(short-lived)垃圾在大多情形下会被有效的释放掉。 在谈GC调优话题前,先看看这个Attila的报告,它阐述了我们在GC方面的一些经验。 Scal

  • 对于开发者来说,JavaScript 的内存管理是自动的、无形的。我们创建的原始值、对象、函数……这一切都会占用内存。 当我们不再需要某个东西时会发生什么?JavaScript 引擎如何发现它并清理它? 可达性(Reachability) JavaScript 中主要的内存管理概念是 可达性。 简而言之,“可达”值是那些以某种方式可访问或可用的值。它们一定是存储在内存中的。 这里列出固有的可达值的

  • 垃圾收集,引用计数,显式分配 和所有的现代语言一样,OCaml提供垃圾收集器,所以你不用像C/C++一样显式地分配和释放内存。 JWZ在他的文章 "Java sucks" rant(Java蛋疼(怒)!): 第一个好家伙是Java没有 free()。其他的都没有所谓了。这几乎掩盖了所有的缺点,不管有多糟糕, 这个有点让后续文档基本都没有意义了,但是...(译注:但是啥大家自己看吧) OCaml的垃