Size: a a a

WebAssembly — русскоговорящее сообщество

2020 August 11

Б

Богдан in WebAssembly — русскоговорящее сообщество
MaxGraey
Вы наверное шутите? По вашему Java и Go просто так столько усилий и ресурсов тратят на совершенствование GC?=) Все остальные примеры и утверждения так же в корне не верны
и что там в java и go делают? я смотрел доклады про gc все они работают по принципу сканирования ссылок и удаления недоступных объектов. Да, есть куча оптимизаций, можно сделать многопоточный сборщик, можно по разному разбивать на поколения и пытаться сколько угодно инкрементально собирать но объем работы не изменится - из-за принципа что удаление объектов происходит через проход/сканирование по графу доступных объектов (потом очистки недоступных) у нас тут прямая связь с количеством объектов в памяти и сложность O(n). Или может я ошибаюсь и есть сборщики мусора которые работают не через сканирование и время их работы не зависит от количества объектов?
источник

lp

lil pep in WebAssembly — русскоговорящее сообщество
Богдан
и что там в java и go делают? я смотрел доклады про gc все они работают по принципу сканирования ссылок и удаления недоступных объектов. Да, есть куча оптимизаций, можно сделать многопоточный сборщик, можно по разному разбивать на поколения и пытаться сколько угодно инкрементально собирать но объем работы не изменится - из-за принципа что удаление объектов происходит через проход/сканирование по графу доступных объектов (потом очистки недоступных) у нас тут прямая связь с количеством объектов в памяти и сложность O(n). Или может я ошибаюсь и есть сборщики мусора которые работают не через сканирование и время их работы не зависит от количества объектов?
я так полагаю дихотомия: GC vs. manual MM? В таком случае удаление N "обектов" тоже O(n)
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Богдан
и что там в java и go делают? я смотрел доклады про gc все они работают по принципу сканирования ссылок и удаления недоступных объектов. Да, есть куча оптимизаций, можно сделать многопоточный сборщик, можно по разному разбивать на поколения и пытаться сколько угодно инкрементально собирать но объем работы не изменится - из-за принципа что удаление объектов происходит через проход/сканирование по графу доступных объектов (потом очистки недоступных) у нас тут прямая связь с количеством объектов в памяти и сложность O(n). Или может я ошибаюсь и есть сборщики мусора которые работают не через сканирование и время их работы не зависит от количества объектов?
Посмотрите на Immix GC. Он даст фору даже лайфтаймам. Начнем с того, что там используется некий аналог зон / bump аллокаторов, то есть уже нет malloc / free а простанство переиспользуется.
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
второе лайфтаймы в большинстве случаем покрывабтся scalar replacment и объекты вообще не попадат в кучу так как все лежит на стеке
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
проблема GC совершенно не в сканировании, а в latency и оптимальных эвристиках когда и где начинать сканирование)
источник

MP

Michael Pavlovsky in WebAssembly — русскоговорящее сообщество
MaxGraey
Посмотрите на Immix GC. Он даст фору даже лайфтаймам. Начнем с того, что там используется некий аналог зон / bump аллокаторов, то есть уже нет malloc / free а простанство переиспользуется.
тебя троллят , не заводись с пол оборота ЛОЛ. Пусть пишет без GC на здоровье
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Michael Pavlovsky
тебя троллят , не заводись с пол оборота ЛОЛ. Пусть пишет без GC на здоровье
Не, здесь другое)
источник

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
MaxGraey
Посмотрите на Immix GC. Он даст фору даже лайфтаймам. Начнем с того, что там используется некий аналог зон / bump аллокаторов, то есть уже нет malloc / free а простанство переиспользуется.
а это разве сильно отличается от обычных аллокаторов?
источник

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
(если что, я про Immix вообще ничего не знаю)
источник

Б

Богдан in WebAssembly — русскоговорящее сообщество
MaxGraey
второе лайфтаймы в большинстве случаем покрывабтся scalar replacment и объекты вообще не попадат в кучу так как все лежит на стеке
Но рано или поздно все равно ведь нужно просканировать и старое поколение? Суть бд в оперативке в том что там в куче находятся миллиарды объектов. И кстати для такой бд сборщик мусора собственно и не нужен, так как всегда явно определяется когда нужно удалять объекты - неважно сколько их в памяти (например 50 млд объектов которые занимают 4тб) - апи бд всегда явное - создать/обновить/удалить такой-то объект из таблицы. База данных уже знает какие другие объекты ссылаются на этот объект потому что и так занимается индексированием. То есть все что мне нужно так это способ явного удаления объекта из памяти.
Только почему-то языки с gc включая java/go/javascript похоже считают что не нужно давать программисту явно удалять объекты. Тут либо возиться с week-ссылками (я правда не знаю какой у них оверхед и будет ли это работать на терабайтах оперативки) либо пилить свои объекты если хранить все данные в числовом массиве (но например в трекере v8 уже 5 лет висит ишью о невозможности аллоцировать массив больше 4гб)
источник

c

cevek in WebAssembly — русскоговорящее сообщество
Богдан
и что там в java и go делают? я смотрел доклады про gc все они работают по принципу сканирования ссылок и удаления недоступных объектов. Да, есть куча оптимизаций, можно сделать многопоточный сборщик, можно по разному разбивать на поколения и пытаться сколько угодно инкрементально собирать но объем работы не изменится - из-за принципа что удаление объектов происходит через проход/сканирование по графу доступных объектов (потом очистки недоступных) у нас тут прямая связь с количеством объектов в памяти и сложность O(n). Или может я ошибаюсь и есть сборщики мусора которые работают не через сканирование и время их работы не зависит от количества объектов?
на сколько я понимаю преимущество gc над подсчетом ссылок в том что gc умеет разруливать циклические зависимости
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Mikhail Voronov
а это разве сильно отличается от обычных аллокаторов?
Immix’s fine-grained heap organization with copying is an excellent match for conservative garbage collection. Most objects are allocated contiguously into 32 KB blocks, and can be copied upon survival. Conservative Immix pins the target objects of ambiguous references at the granularity of 256 B lines. The size of contiguous allocation regions and the associated potential for better locality is thus increased by a factor of eight over MCC, which pins at a page granularity. The  granularity of pinning and associated wasted space is also reduced sixteen-fold. Objects referenced from ambiguous roots are pinned on the line(s) they occupy, but Immix may copy all other objects according to its usual heuristics. This feature limits the impact of ambiguous roots to internal line fragmentation. Immix allocates into both completely empty blocks and partially occupied blocks, but never into used lines. When allocating into an empty block, the corresponding object map entries are first zeroed and then set as each object is allocated.
источник

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
Богдан
Но рано или поздно все равно ведь нужно просканировать и старое поколение? Суть бд в оперативке в том что там в куче находятся миллиарды объектов. И кстати для такой бд сборщик мусора собственно и не нужен, так как всегда явно определяется когда нужно удалять объекты - неважно сколько их в памяти (например 50 млд объектов которые занимают 4тб) - апи бд всегда явное - создать/обновить/удалить такой-то объект из таблицы. База данных уже знает какие другие объекты ссылаются на этот объект потому что и так занимается индексированием. То есть все что мне нужно так это способ явного удаления объекта из памяти.
Только почему-то языки с gc включая java/go/javascript похоже считают что не нужно давать программисту явно удалять объекты. Тут либо возиться с week-ссылками (я правда не знаю какой у них оверхед и будет ли это работать на терабайтах оперативки) либо пилить свои объекты если хранить все данные в числовом массиве (но например в трекере v8 уже 5 лет висит ишью о невозможности аллоцировать массив больше 4гб)
мне кажется, что для БД GC реально не особо нужен, особено, если важно latency, но есть куча других приложений, где без GC сложно. К упоминавшимся уже lock-free можно добавить функциональное программирование
источник

c

cevek in WebAssembly — русскоговорящее сообщество
Mikhail Voronov
мне кажется, что для БД GC реально не особо нужен, особено, если важно latency, но есть куча других приложений, где без GC сложно. К упоминавшимся уже lock-free можно добавить функциональное программирование
а вот в фп получить циклические зависимости по моему нереально и для них можно сильно все проще сделать
источник

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
MaxGraey
Immix’s fine-grained heap organization with copying is an excellent match for conservative garbage collection. Most objects are allocated contiguously into 32 KB blocks, and can be copied upon survival. Conservative Immix pins the target objects of ambiguous references at the granularity of 256 B lines. The size of contiguous allocation regions and the associated potential for better locality is thus increased by a factor of eight over MCC, which pins at a page granularity. The  granularity of pinning and associated wasted space is also reduced sixteen-fold. Objects referenced from ambiguous roots are pinned on the line(s) they occupy, but Immix may copy all other objects according to its usual heuristics. This feature limits the impact of ambiguous roots to internal line fragmentation. Immix allocates into both completely empty blocks and partially occupied blocks, but never into used lines. When allocating into an empty block, the corresponding object map entries are first zeroed and then set as each object is allocated.
в принципе, разные концепции отсюда итак есть в современных аллокаторах, но тут они похоже все вместе подогнаны именно под gc
источник

Б

Богдан in WebAssembly — русскоговорящее сообщество
cevek
на сколько я понимаю преимущество gc над подсчетом ссылок в том что gc умеет разруливать циклические зависимости
Получается что если к подсчету ссылок добавить разруливание циклических ссылок то как раз и получится GC нового поколения (время которого не будет зависеть от количества объектов в отличие от всех существующих gc). Интересно кто-то уже это придумал?
источник

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
cevek
а вот в фп получить циклические зависимости по моему нереально и для них можно сильно все проще сделать
но фпшников этому не научишь, потому что они не захотят сколько бы то ни было ручное управление памятью
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Mikhail Voronov
в принципе, разные концепции отсюда итак есть в современных аллокаторах, но тут они похоже все вместе подогнаны именно под gc
Плюс там не сказано, что все эти регионы и кэш линии могут переиспользоваться и все это еще и cache-friendly и там практически нет фрагментации
источник

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
MaxGraey
Плюс там не сказано, что все эти регионы и кэш линии могут переиспользоваться и все это еще и cache-friendly и там практически нет фрагментации
в jemalloc, кстати, применяется интересная концепция для этого: они все extent'ы (хранилище больших объектов) и slab'ы (малых объектов) кладут в PairingHeap по виртуальному адресу. Тем самым слабы и экстенты с меньшим виртуальным адресом будут использованы с большей вероятностью и со временем там должны накопиться горячие объекты, а холодные, напротив, будут дальше от начала бина
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Богдан
Получается что если к подсчету ссылок добавить разруливание циклических ссылок то как раз и получится GC нового поколения (время которого не будет зависеть от количества объектов в отличие от всех существующих gc). Интересно кто-то уже это придумал?
Удивительно, значит в AssemblyScript GC нового поколения) Так как используется ARC для всего кроме циклически связанных объектов
источник