АлленШоу,
Google V8 Heap состоит из нескольких разных пространств. Есть отличный пост "Обзор V8: Сборка мусора.", который объясняет, как организована куча V8:
New-space: Most objects are allocated here. New-space is small and is
designed to be garbage collected very quickly, independent of other
spaces.
Old-pointer-space: Contains most objects which may have pointers to
other objects. Most objects are moved here after surviving in new-space
for a while.
Old-data-space: Contains objects which just contain raw data (no
pointers to other objects). Strings, boxed numbers, and arrays of
unboxed doubles are moved here after surviving in new-space for a
while.
Large-object-space: This space contains objects which are larger than
the size limits of other spaces. Each object gets its own mmap'd region
of memory. Large objects are never moved by the garbage collector.
Code-space: Code objects, which contain JITed instructions, are
allocated here. This is the only space with executable memory (although
Codes may be allocated in large-object-space, and those are executable, too).
Cell-space, property-cell-space and map-space: These spaces contain
Cells, PropertyCells, and Maps, respectively. Each of these spaces
contains objects which are all the same size and has some constraints
on what kind of objects they point to, which simplifies collection.
Далее в статье Конрада объясняется, что V8 GC построен на основе алгоритма Чейни.
Реализация кучи V8 находится в куче. cc и куча .ч. Инициализация кучи начинается с line 5423
. Метод Address NewSpaceStart()
найден на line 615
из heap.h содержит адрес, где начинается новое пространство, и где хранятся объекты, используя преимущество временной локальности.
Теперь о вашем втором вопросе: делает ли JVM то же самое? Забавный факт: существует 3 основных производственных JVM, и все они по-разному реализуют свои алгоритмы GC. Есть отличный блог о производительности, в котором написана статья "Как сборка мусора отличается в трех больших JVM", в которой более подробно обсуждается их реализация.
Существуют также разновидности GC, например, если вам нужна среда с малой задержкой, если вы переписали JVM на Scala и параметры настройки задержки в среде .NET.
Пожалуйста, дай мне знать, если возникнут какие-либо вопросы!
Спасибо за ваше время,
Теплые пожелания,
06.06.2015