|
|
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonчтобы понять сколько стека по дефолтуОт мегабайта и выше, если только вы не ядрёный драйвер делаете. Плюс, может автоматически увеличиваться, если "туды покладено" нечто бОльшее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 07:46 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorovmaytonчтобы понять сколько стека по дефолтуОт мегабайта и выше, если только вы не ядрёный драйвер делаете. Плюс, может автоматически увеличиваться, если "туды покладено" нечто бОльшее. Мда... если смешивать много malloc и aalloc то у нас будет пухнуть оба сегмента что в результате скорее всего приведет к нерациональному использованию места. Лучше уж наверное оставить аллокацию в куче но применить к ней стековые алгоритмы очистки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 10:24 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonЛучше уж наверное оставить аллокацию в куче но применить к ней стековые алгоритмы очистки. тогда она рискует из кучи превратиться в стек :) сейчас плавно придём к тому, что в приложении нужно иметь несколько пулов для разных нужд, и пулы для короткоживущих данных просто грохать тем или иным способом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 10:51 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
ИзопропилmaytonЛучше уж наверное оставить аллокацию в куче но применить к ней стековые алгоритмы очистки. тогда она рискует из кучи превратиться в стек :) сейчас плавно придём к тому, что в приложении нужно иметь несколько пулов для разных нужд, и пулы для короткоживущих данных просто грохать тем или иным способом. Это и есть моё предложение по поводу хинтов к операции new. По поводу JVM. Я наблюдал ее активности через графики JVisualVM и пришел к следующему. Есть мысль что необходимо минимизировать миграцию обЪектов Eden->Survival(0|1)->Old. А чтоб минимизировать нужно фактически детектировать ЧТО за объекты постоянно прыгают из Эдемского сада в "старички". Или что за алгоритм их продуцирует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 11:13 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonНо я обращу внимание на то что когда мы решаем задачи масштабирования в общем понимании этого слова то нам нужно решать вопросы конкурентных updates. у тебя дыра в общего характера знаниях. все что конкурентно - не масштабируется по определению - чем больше людей ломится в одну дверь, тем хуже с пропускной способностью. масштабирование - это как раз и есть техника разбиения общей задачи на взаимно изолированные и неконкуретные части. говоря проще - стройте побольше взаимо независимых дверей. даже вариант MxN - M серверов приложений на N баз данных - уже тупиковый, потому что каждый сервер баз данных должен поддерживать M сосединений. сервер приложений и база данных должны иметь связь 1:1 и только, иначе никакого масштабирования не будет, ваш КО а раз 1:1 - то ... какие претензии к имению одного локального сервера баз данных (а все остальное - уже коммуникации на уровне веб сервисов). простая же истина ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 12:35 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
ИзопропилmaytonЛучше уж наверное оставить аллокацию в куче но применить к ней стековые алгоритмы очистки. тогда она рискует из кучи превратиться в стек :) сейчас плавно придём к тому, что в приложении нужно иметь несколько пулов для разных нужд, и пулы для короткоживущих данных просто грохать тем или иным способом. ура, кажется кто-то начал что-то подозревать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 12:37 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonИзопропилпропущено... тогда она рискует из кучи превратиться в стек :) сейчас плавно придём к тому, что в приложении нужно иметь несколько пулов для разных нужд, и пулы для короткоживущих данных просто грохать тем или иным способом. Это и есть моё предложение по поводу хинтов к операции new. По поводу JVM. Я наблюдал ее активности через графики JVisualVM и пришел к следующему. Есть мысль что необходимо минимизировать миграцию обЪектов Eden->Survival(0|1)->Old. А чтоб минимизировать нужно фактически детектировать ЧТО за объекты постоянно прыгают из Эдемского сада в "старички". Или что за алгоритм их продуцирует. твои хинты не имеют никакого смысла. долгоживущие объекты тоже чистить нужно, понятие долгоживучести оно такое, ну не миллисекунды, секунды, тем не менее. простейший случай - внутренняя "база данных", приложение поддерживает некий внутренний мир, заселенный взаимодействующими объектами, а процессы вебсервисы просто дергают события этого мира. ну так эти объекты-в мирке тоже умирают иногда, как их чистить-то, если их - сотни гигабайт? хотя идея о неком анализаторе, когда объект по природе краткоживущий вдруг перекочевал в долгоживущие - это да. ну так это и самому можно сделать, завести себе timestamp поле, и анализировать его время от времени, вываливая в лог ругань при превышении нормативного времени жизни в чем проблема-то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 12:41 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
nojavaхотя идея о неком анализаторе, когда объект по природе краткоживущий вдруг перекочевал в долгоживущие - это да. ну так это и самому можно сделать, завести себе timestamp поле, и анализировать его время от времени, вываливая в лог ругань при превышении нормативного времени жизни в чем проблема-то? Давай исходить из предположения что у меня неизвестное приложение. Про БД и ORM - ничего не известно. И я использую закрытые сущности из других библиотек. И куда я буду добавлять этот timestamp? И каким образом? Расширить? Инкапсулировать? В какой момент времени и кто будет проверять этот timestamp? Я не против анализатора но мне неясен механизм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 13:48 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
nojavaу тебя дыра в общего характера знаниях. все что конкурентно - не масштабируется по определению - чем больше людей ломится в одну дверь, тем хуже с пропускной способностью. масштабирование - это как раз и есть техника разбиения общей задачи на взаимно изолированные и неконкуретные части. говоря проще - стройте побольше взаимо независимых дверей. даже вариант MxN - M серверов приложений на N баз данных - уже тупиковый, потому что каждый сервер баз данных должен поддерживать M сосединений. сервер приложений и база данных должны иметь связь 1:1 и только, иначе никакого масштабирования не будет, ваш КО а раз 1:1 - то ... какие претензии к имению одного локального сервера баз данных (а все остальное - уже коммуникации на уровне веб сервисов). простая же истина Чувак эта тема очень интересная - но я тебя прошу. Отдельным топиком. Поднимай тему и задавай свой вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 13:50 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonЧувак эта тема очень интересная - но я тебя прошу. Отдельным топиком. Поднимай тему и задавай свой вопрос. Все что тебе нужно сделать - это самому себе - "да, я вообще не разбираюсь в масштабировании". И никаких отдельных топиков не нужно. Другим это понятно уже давно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 14:09 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonnojavaхотя идея о неком анализаторе, когда объект по природе краткоживущий вдруг перекочевал в долгоживущие - это да. ну так это и самому можно сделать, завести себе timestamp поле, и анализировать его время от времени, вываливая в лог ругань при превышении нормативного времени жизни в чем проблема-то? Давай исходить из предположения что у меня неизвестное приложение. Про БД и ORM - ничего не известно. И я использую закрытые сущности из других библиотек. И куда я буду добавлять этот timestamp? И каким образом? Расширить? Инкапсулировать? В какой момент времени и кто будет проверять этот timestamp? Я не против анализатора но мне неясен механизм. С закрытыми сущностями конечно печаль печаль. А так - я тебе просто описал подход, принятый в известных мне успешных проектах с долговременным хипом на сотни гигабайт. Они вообще ничего никогда не чистят долговременное, вместо этого они просто хранят объекты вечно, выставляя булевый флаг поле deleted и принудительно выставляя жесткую ссылку на объект, которая не позволит сбросить счетчик в ноль никогда. А очистка происходит ествественным путем - на выходных сервер перезагружается, память чистится так сказать естественным путем. Java она такая java. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 14:12 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonМда... если смешивать много malloc и aalloc то у нас будет пухнуть оба сегментаЗабудьте про сегменты. Если исключить экзотику вроде DOS и той же OS/2, CS == DS == SS == FS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 19:27 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
У сборщика мусора в Java есть одно серьёзное преимущество - не нужны hazard pointers для реализации Lock-free алгоритмов, т.к. не возникает ABA-проблемы за исключением редких случаев. Это актуально для архитектур типа x86_64, где нет LL/SC операций. Для всего остального по всем параметрам лучше или memory-reuse, или детерминированное освобождение памяти через smart-pointers. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2016, 23:27 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
На хабре статья вышла про эволюцию сборщика мусора в Go У меня вопрос появился: почему никто не развивает работу со счетчиками ссылок? Или как там оно правильно называется. По сути как смарт-указатели из С++. Еще WinAPI использует для работы с объектами ядра. Технически реализация не сложная: присвоил ссылку на объект переменной сделал Счетчик++, освободил - Счетчик--. Получил 0, запустил деструктор. Плюсы очевидны: 1. Объект уничтожается именно тогда, когда он стал не нужен, т.е. можно управлять этим процессом, не получая остановку проги сборщиком в самый напряженный момент. 2. Возможен полноценный деструктор, а не малоприменимое недоразумение в виде финализатора, который неизвестно когда будет вызван сборщиком мусора. Минусы: 1. Постоянное изменение счетчика. Плюс надо атомарность соблюдать, т.к. сейчас все ЯП многопоточные. 2. Память под счетчик. 4 байта на объект может быть критично при большом количестве маленьких объектов. По моему минусы не такие уж и серьезные. Но, как понимаю они перевешивают плюсы раз большинство ЯП используют сборку мусора. Теоретически в любом ЯП со сборщиком мусора можно безболезненно заменить его на использование счетчиков ссылок, и это никак не потребует переписывания кода на этом ЯП, но никто не пытается. Интересно почему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 13:02 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Dima TНа хабре статья вышла про эволюцию сборщика мусора в Go У меня вопрос появился: почему никто не развивает работу со счетчиками ссылок? Или как там оно правильно называется. По сути как смарт-указатели из С++. Еще WinAPI использует для работы с объектами ядра. Технически реализация не сложная: присвоил ссылку на объект переменной сделал Счетчик++, освободил - Счетчик--. Получил 0, запустил деструктор. Плюсы очевидны: 1. Объект уничтожается именно тогда, когда он стал не нужен, т.е. можно управлять этим процессом, не получая остановку проги сборщиком в самый напряженный момент. 2. Возможен полноценный деструктор, а не малоприменимое недоразумение в виде финализатора, который неизвестно когда будет вызван сборщиком мусора. Минусы: 1. Постоянное изменение счетчика. Плюс надо атомарность соблюдать, т.к. сейчас все ЯП многопоточные. 2. Память под счетчик. 4 байта на объект может быть критично при большом количестве маленьких объектов. По моему минусы не такие уж и серьезные. Но, как понимаю они перевешивают плюсы раз большинство ЯП используют сборку мусора. Теоретически в любом ЯП со сборщиком мусора можно безболезненно заменить его на использование счетчиков ссылок, и это никак не потребует переписывания кода на этом ЯП, но никто не пытается. Интересно почему? А как GC считает количество ссылок, он без счетчиков, по стеку каждого потока бегает? Бывает 2 основных вида smart-pointers: 1. shared pointers (std::shared_ptr<>) - на каждый указатель по 1 атомарному счетчику ссылок (8 bytes), использует медленные CAS-операции - ядро CPU замирает на 1000 тактов 2. hazard pointers - на каждый указатель по ~1-4*threads дополнительных указателей (8-32 bytes per thread), использует быстрые MOV-операции, сильно быстрее для многопоточных программ и оптимизируются внеочередным исполнением на CPU В ЯП с GC не пытаются переписать на указатели типа 1 (shared pointers) со счетчиком, т.к. без культуры использование общих между потоками указателей со счетчиком в многопоточной программе приведет к её замедлению. Почему ЯП с GC не пытаются переписать на указатели типа 2 (hazard pointers)? Вот как раз GC примерно так и работает, за исключением того, что hazard pointers сборщик мусора управляемый и сегментированный: - есть возможность детерминировано вручную запускать сборку мусора вызовом функции Scan() - для каждого контейнера обычно создается свой сборщик мусора (своя структура hazard pointers) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 13:54 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
GCjavaABAА как GC считает количество ссылок, он без счетчиков, по стеку каждого потока бегает? бегает. и за процессорными регистрами следит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 14:02 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
GCjavaABAА как GC считает количество ссылок, он без счетчиков, по стеку каждого потока бегает? Глубоко не вникал, но как понимаю у GC нет необходимости знать сколько ссылок на объект, достаточно флага: есть ссылки/нет ссылок. GCjavaABAиспользует медленные CAS-операции - ядро CPU замирает на 1000 тактов Как вариант: две lock-free очереди, в одну пишем указатель на объект для увеличения счетчика, во вторую уменьшение и отдельный поток на разгребание этих очередей. Только у него доступ ко всем счетчикам. Тогда не надо никакой атомарности. Можно общую очередь сделать, писать туда указатель и флаг +/-. Правда при таком подходе теряем полноценный деструктор, т.к. все равно будет задержка и запуск в другом потоке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 14:27 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
ИзопропилGCjavaABAА как GC считает количество ссылок, он без счетчиков, по стеку каждого потока бегает? бегает. и за процессорными регистрами следит А есть возможность вызвать функцию принудительного сбора мусора? И есть ли возможность (вручную указывать) заносить ссылки в разные сегменты сборщика мусора, чтобы очищать только заданные сегменты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 14:28 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Dima TGCjavaABAА как GC считает количество ссылок, он без счетчиков, по стеку каждого потока бегает? Глубоко не вникал, но как понимаю у GC нет необходимости знать сколько ссылок на объект, достаточно флага: есть ссылки/нет ссылок. GCjavaABAиспользует медленные CAS-операции - ядро CPU замирает на 1000 тактов Как вариант: две lock-free очереди , в одну пишем указатель на объект для увеличения счетчика, во вторую уменьшение и отдельный поток на разгребание этих очередей. Только у него доступ ко всем счетчикам. Тогда не надо никакой атомарности. Можно общую очередь сделать, писать туда указатель и флаг +/-. Правда при таком подходе теряем полноценный деструктор, т.к. все равно будет задержка и запуск в другом потоке. "есть ссылки/нет ссылок" - кто-то этот флаг должен поставить, а этот кто-то как-то должен быть уверен, что больше ссылок нет в других потоках. Да, выше у меня опечатка, shared_ptr использует не CAS in loop (lock-free), а RMW-операцию (wait-free). Т.е. вместо одного wait-free (1000 тактов) счетчика использовать 2 lock-free очереди ( кол-во конкурентных потоков х 2 x 1000 тактов), в чем профит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 14:36 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Dima TGCjavaABAиспользует медленные CAS-операции - ядро CPU замирает на 1000 тактов Как вариант: две lock-free очереди, в одну пишем указатель на объект для увеличения счетчика, во вторую уменьшение и отдельный поток на разгребание этих очередей. Только у него доступ ко всем счетчикам. Тогда не надо никакой атомарности. Можно общую очередь сделать, писать туда указатель и флаг +/-. Правда при таком подходе теряем полноценный деструктор, т.к. все равно будет задержка и запуск в другом потоке. Фигню я придумал. В основе lock-free теже атомарные операции. Т.е. никакой разницы в очередь писать или сразу счетчик менять. Надо затестить правда ли они такие тормозные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 14:37 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Dima TDima Tпропущено... Как вариант: две lock-free очереди, в одну пишем указатель на объект для увеличения счетчика, во вторую уменьшение и отдельный поток на разгребание этих очередей. Только у него доступ ко всем счетчикам. Тогда не надо никакой атомарности. Можно общую очередь сделать, писать туда указатель и флаг +/-. Правда при таком подходе теряем полноценный деструктор, т.к. все равно будет задержка и запуск в другом потоке. Фигню я придумал. В основе lock-free теже атомарные операции. Т.е. никакой разницы в очередь писать или сразу счетчик менять. Надо затестить правда ли они такие тормозные. Если атомарный декремент сделать отложенной операцией то мы можем получить парадокс когда счетчик ссылок может быть отрицательным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 14:46 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
maytonЕсли атомарный декремент сделать отложенной операцией то мы можем получить парадокс когда счетчик ссылок может быть отрицательным. Это легко решается: проверять значения счетчиков когда пуста очередь плюсования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 14:59 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Dima TФигню я придумал. В основе lock-free теже атомарные операции. Т.е. никакой разницы в очередь писать или сразу счетчик менять. Надо затестить правда ли они такие тормозные. Там даже не в атомарности дело, а в том что как только возникает второй поток, то это ничем не лучше GC, потому что имеет все те же недостатки что и GC (в частности асинхронность удаления), в добавок к недостаткам смартуказателей )) Вообще кроме перечисленных выше недостатков смартуказателей самый главный это невозможность автоматического отслеживания циклических ссылок. Поэтому в языках где поставлена задача минимизировать мысли программиста и делают GC а не смартуказатели. Считается что программист не способен выбрать между shared_ptr и weak_ptr чтобы вручную убрать циклы. Вероятно создатели этих языков судят по себе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 15:05 |
|
||
|
Тяпничный идеальный сборщик мусора
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyТам даже не в атомарности дело, а в том что как только возникает второй поток, то это ничем не лучше GC, потому что имеет все те же недостатки что и GC (в частности асинхронность удаления), в добавок к недостаткам смартуказателей )) Лучше хотя бы тем что поток полностью асинхронный и не требует прерывания основного. С ядрами нынче проблем нет. В основном проблемы чем бы их занять. Anatoly MoskovskyВообще кроме перечисленных выше недостатков смартуказателей самый главный это невозможность автоматического отслеживания циклических ссылок. Это я как-то упустил. Тоже серьезный минус при кривых руках :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 15:18 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39271511&tid=1340661]: |
0ms |
get settings: |
6ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
269ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 578ms |

| 0 / 0 |
