Подтвердить что ты не робот

Что такое подход сбора мусора Go в сравнении с другими?

Я мало знаю о языке программирования Go, но я видел несколько утверждений о том, что Go имеет бесплатную сборку мусора, и она намного лучше, чем другие сборщики мусора (например, сборщик мусора JVM). Я разработал приложение для JVM, и я знаю, что сборщик мусора JVM не является латентным (особенно при использовании большой памяти).

Мне было интересно, в чем разница между подходом к сборке мусора в Go и другими, которые делают его доступным без задержки?

Спасибо заранее.


Изменить: @Все я полностью отредактировал этот вопрос, пожалуйста, проголосуйте, чтобы повторно открыть этот вопрос, если найдете его конструктивным.

4b9b3361

Ответ 1

Go не имеет бесплатной сборки мусора. Если вы можете указать, где эти претензии, я хотел бы попытаться исправить их.

Одно из преимуществ, которое, по нашему мнению, принадлежит Go, - это то, что он дает вам больше контроля над макетом памяти. Например, простой 2D-графический пакет может определить:

type Rect struct {
    Min Point
    Max Point
}

type Point struct {
    X int
    Y int
}

В Go, Rect - всего четыре целых числа, смежные в памяти. Вы все равно можете передать & r.Max для функции, ожидающей точку * Point, которая является указателем на середину переменной Rect r.

В Java эквивалентное выражение будет состоять из классов Rect и Point, и в этом случае поля Min и Max в Rect будут указателями на отдельно выделенные объекты. Это требует большего количества выделенных объектов, занимающих больше памяти и предоставления сборщику мусора больше отслеживать и больше делать. С другой стороны, он всегда избегает создания указателя на середину объекта.

По сравнению с Java, тогда Go дает программисту больше контроля над макетом памяти, и вы можете использовать этот элемент управления для уменьшения нагрузки на сборщик мусора. Это может быть очень важно в программах с большими объемами данных. Управление макетом памяти также может быть важным для извлечения производительности из оборудования из-за эффектов кеша и т.д., Но тангенциального к исходному вопросу.

Коллекционер в текущих распределениях Go является разумным, но ни в коем случае не является современным. У нас есть планы потратить больше усилий, чтобы улучшить его в ближайшие год-два. Чтобы быть ясным, Go сборщик мусора, конечно, не так хорош, как современные сборщики мусора Java, но мы считаем, что проще начать писать программы, для которых не требуется столько сбора мусора, поэтому чистый эффект все равно может быть таким, что сбор мусора меньше проблемы в программе Go, чем в эквивалентной программе Java.