powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Тяпничный идеальный сборщик мусора
87 сообщений из 87, показаны все 4 страниц
Тяпничный идеальный сборщик мусора
    #39270512
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет друзья.

Как всегда мы начинаем тяпничный сабж. Что-бы хотелось обсудить.
На волне кризисов возраста и событий в рынке It многие братия-джуны
утратили дух и духовность. Впали в страх и ужас и периодически
сидят в углу комнаты и охавтив коленки повывают эдак - "Ыыыыыы....". На чём лучше кодить?
Что лучше изучать для будущей работы?

Иные мидлы впали в ереси и пытаются метаться из С++ в D а потом не дай
бох во всякие Rust и даже не побоюсь этого слова GoLang у которого
нет православных Exceptions.

Вобщем - беда!

И во всех языках и технологиях краеугольным камнем или догмой наискосок
идет магическая концепция имя которой MM или GC то бишь управление памятью
и уборка мусора.

И любые споры или дискурсы о ЯП или системе программирования рано или
поздно сводятся к вопросу - КАКОВ ЗДЕСЬ MM/GC. А бородатые синьоры
сурово сдвинув брови способны слить в помойное ведро любое ваше
дарованье одним лишь своим "мнением" по поводу класса MM которое
вы заюзали в тестовом задании или стартапе.

А каков он? MM или GC?

Итак давайте обсудим современный идеальный Garbage Collector

Я предлагаю очертить наши собственные требования и чаяния по отношению к GC:

Идеальный GC должен:

1) Хорошо скейлится. . Тоесть при переходе с 16G кучи до 32G мы не должны
наблюдать "удвоенную" нагрузку на процессы GC.

2) Иметь жестко регулируемый Stop-The-World. . Тоест грубо говоря мы должны
иметь ИНСТРУМЕНТ или регулятор которым мы говорим дескыть - Мы не желаем
чтобы стоп-вселенная длилась более чем 10 милисекунд. Вот так вот.

3) Иметь средства диагностики и отладки . Ну здесь как-бе все ясно. Что. Где. Когда.
Детальный лог по активностям GC.

4) Иметь возможность workaround механизма GC . Как ни крути но есть
ситуации когда мы сами желаем иметь прямой неуправляемый доступ к памяти
и мы требуем чтобы (на свой страх и риск) у нас все таки была возможность
выделять сырую память и удалять ее вручную.

.... здесь можно еще дописать ваши предложения.

Можно также обсудить че есть и где какие алгоритмы используются.

Таблицы и графики - приветствуются.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270549
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Управление памятью на свой страх и риск aka возможность считывания byte/signed/usigned int/float/double/etc с указанной позиции в памяти это конечно хорошо, но толку мало - программы это структуры данных и работа с ними. Поэтому нужна нормальная поддержка указателей на структуры, которые расположены вне хипа с поддержкой на уровне рантайма, языка и его стандартной библиотеки. Желательно так, чтобы работа с ними мало чем отличалась от работы с обычными объектами на хипе.

Пока это нет - в языке с GC будут STW, с долгими и мучительными паузы, или же велосипеды, которые вышеуказанное эмулируют.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270590
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТаблицы и графики - приветствуются.

Господи, и понаписал же. А теперь смотри - идеальный менеджер памяти.

Универсального идеального не может быть по определению, потому что все универсальное - это сукс.
Пример - таракан - умеет и летать, и плавать и прыгать, но в сравнении с бабочкой, водомеркой и кузнечиком - делает это плохо.


Пример из IT? оок.

Веб приложение - паттерн - поступил запрос, его распарсили, спросили базу данных, сделали шаблон, отправили.
Так вот. В этом случае достаточно просто зарезервировать, не выделить большой кусок памяти, и туда методом аппендирования
добавлять объекты по мере необходимости, сдвигая указатель по мере выделения.

Как только запрос будет отправлен клиенту - весь этот кусок памяти хрясь и удалется целиком, не нужно заниматься мелким анонированием вприсядку с кучей free() и прочих delete вызовов.

Аллоцирование предельно быстрое, предельно быстрое деаллоцирование.

Работает отлично только с одним типом приложения - веб. Для GUI такое не канает - там сидят долгосрочные, долгоживущие объекты, и нужно придумывать свою идеальную методику.


Базы данных? там вообще отдельно. Там есть 64-е бита в операционках, и такая штука как mmap(). Файл базы данных можно тупо зааллоцировать как readonly в память приложения (т.е. файл базы данных читается как плоский массив байтов), и вместо того, чтоб несчастный client.name по десяткам раз туда-сюда конвертировать при запросе - просто возвращать указатель на кусок памяти, фактически на кусок файла, который отображен в память. Писать в этот кусок нельзя, потому приложение с dangling pointer базу данных не разрушит.

Чтение ускоряется примерно в две-три сотни раз.


И т.д.


В результате типовое приложение веб-база данных можно разогнать в десятки раз.

Но зачем?
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270599
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати для GUI типов приложений ничего лучше чем ARC (automated reference counting) и Owner-Container еще не придумано (типовые реализации - Delphi, ну и все что в Cocoa/MacOSX/iOS). Там хоть время реакции на действия пользователя предсказуемо.

А использовать GC в GUI, где требуется интерактивность и гарантированное время реации - это вообще финиш.

Как порой радует Netbeans или Eclipse с их типовыми залепухами - сидишь, вбиваешь код, а оно такое жжжжжжж.... бац, на 10 секунд ушло в каматоз. Потом бац, ожило, ништяк, половина того, что ты вбивал пока оно тупило - потеряно. А так - отличные среды, дада.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270632
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaГосподи, и понаписал же. А теперь смотри - идеальный менеджер памяти.

Универсального идеального не может быть по определению, потому что все универсальное - это сукс.

Ну... я про универсальность не говорил. Это уже ваши домыслы, господин хороший.
И кстати коли вы новичок - то знайте что каждую тяпницу я буду вас созывать на мозговой
штурм. В неформальной обстановке. Тоесть галстуки на дорогих костюмах
можно слегка "ослабить".
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270633
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonnojavaГосподи, и понаписал же. А теперь смотри - идеальный менеджер памяти.

Универсального идеального не может быть по определению, потому что все универсальное - это сукс.

Ну... я про универсальность не говорил. Это уже ваши домыслы, господин хороший.
И кстати коли вы новичок - то знайте что каждую тяпницу я буду вас созывать на мозговой
штурм. В неформальной обстановке. Тоесть галстуки на дорогих костюмах
можно слегка "ослабить".

я новичок? атас....
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270640
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaПример из IT? оок.

Веб приложение - паттерн - поступил запрос, его распарсили, спросили базу данных, сделали шаблон, отправили.
Так вот. В этом случае достаточно просто зарезервировать, не выделить большой кусок памяти, и туда методом аппендирования
добавлять объекты по мере необходимости, сдвигая указатель по мере выделения.

Как только запрос будет отправлен клиенту - весь этот кусок памяти хрясь и удалется целиком, не нужно заниматься мелким анонированием вприсядку с кучей free() и прочих delete вызовов.

Аллоцирование предельно быстрое, предельно быстрое деаллоцирование.

Здесь если заменить очередь на stack - то ничего принципиально не меняется для обработки 1 HTTP-реквеста.

Например

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void processHttpRequest(){
      tempStuct1 *ts=_alloca(...);
      .......
      tempStuct99 *ts=_alloca(...);
      .....
     // free не надо.
}
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270641
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaя новичок? атас....
У тебя несколько десятков сообщений. И да.. я понимаю что своё настоящее имя ты
тщательно скрыл.

Стесняшка ..
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270643
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaБазы данных? там вообще отдельно. Там есть 64-е бита в операционках, и такая штука как mmap(). Файл базы данных можно тупо зааллоцировать как readonly в память приложения (т.е. файл базы данных читается как плоский массив байтов), и вместо того, чтоб несчастный client.name по десяткам раз туда-сюда конвертировать при запросе - просто возвращать указатель на кусок памяти, фактически на кусок файла, который отображен в память. Писать в этот кусок нельзя, потому приложение с dangling pointer базу данных не разрушит.

Чтение ускоряется примерно в две-три сотни раз.

Очень странный подход. Он годный для аналитики, и анализа исторических данных
но вследствие объема (во много раз больше оперативки) я его-бы не советовал
так применять.

Но если у вас есть конкретный юзкейс где мы зачем-то должны в память
приложения (!) прогружать файл (!) баз данных причем в режиме (!) R/O
то прошу привести пример.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270647
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonnojavaПример из IT? оок.

Веб приложение - паттерн - поступил запрос, его распарсили, спросили базу данных, сделали шаблон, отправили.
Так вот. В этом случае достаточно просто зарезервировать, не выделить большой кусок памяти, и туда методом аппендирования
добавлять объекты по мере необходимости, сдвигая указатель по мере выделения.

Как только запрос будет отправлен клиенту - весь этот кусок памяти хрясь и удалется целиком, не нужно заниматься мелким анонированием вприсядку с кучей free() и прочих delete вызовов.

Аллоцирование предельно быстрое, предельно быстрое деаллоцирование.

Здесь если заменить очередь на stack - то ничего принципиально не меняется для обработки 1 HTTP-реквеста.

Например

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void processHttpRequest(){
      tempStuct1 *ts=_alloca(...);
      .......
      tempStuct99 *ts=_alloca(...);
      .....
     // free не надо.
}



это теоретически.
а практически стек сильно ограничен, если говорить про многотредовость - то порой ограничен 512 килобайтами, не разгуляешься
плюс не так секурно.

потому стек проще реализовать самому отдельно, благо это вообще не сложно - просто передвигать указатель.


плюс выделение памяти под стек vs резервирование. если резервировать через mmap(), то
реально память не выделяется, хотя можно зарезервировать хоть два гигабайта - просто операционка выкусит данный диапазон из
адресного пространства приложения, а выделение будет делать сама, по мере того, как ты будешь тыкаться указателем в блоки памяти этого диапазона.

плюс через madvise можно сингализировать операционке, что пусть суетится и выделяет уже следующий кусок

ну и большой кусок памяти имеет шанс быть выделенным через hugetlb, это дает новый класс бенефитов
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270654
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaпотому стек проще реализовать самому отдельно, благо это вообще не сложно - просто передвигать указатель.

Примерно так и работает Eden-space в Java.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270657
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonnojavaБазы данных? там вообще отдельно. Там есть 64-е бита в операционках, и такая штука как mmap(). Файл базы данных можно тупо зааллоцировать как readonly в память приложения (т.е. файл базы данных читается как плоский массив байтов), и вместо того, чтоб несчастный client.name по десяткам раз туда-сюда конвертировать при запросе - просто возвращать указатель на кусок памяти, фактически на кусок файла, который отображен в память. Писать в этот кусок нельзя, потому приложение с dangling pointer базу данных не разрушит.

Чтение ускоряется примерно в две-три сотни раз.

Очень странный подход. Он годный для аналитики, и анализа исторических данных
но вследствие объема (во много раз больше оперативки) я его-бы не советовал
так применять.

Но если у вас есть конкретный юзкейс где мы зачем-то должны в память
приложения (!) прогружать файл (!) баз данных причем в режиме (!) R/O
то прошу привести пример.

Ты опять видать не понял. mmap() - он не загружает файл в память приложения, с чего-бы вдруг?

он просто говорит операционке:

- Слушай, диапазон памяти с 9000 гигабайта по 9230 гигабайт - это отображение файла database.dbf

Если приложение начнет читать что-то с 9101 гигабайта - то оок, берешь подсовываешь ему то, что лежит в 101-м гигабайте файла database.dbf

при этом все эти 230 гигабайт спокойно лежат на диске, и только если приложение начнет чего-то реально читать - то только реальный режим прочитанного (с поправкой на стандартные 4096 байта страницы) и будет подкачано в память.

и выдавлено из физической памяти само, если не будет уже никому не нужно.

итого - все управление кеш памятью в базе данных ложится на операционную систему.
Oracle, к примеру, отключает буферизацию средствами OS и занимается управлением буферным кешем самостоятельно, дублируя OS
А тут ты вообще не паришься - пусть операционка сама думает, как твои данные кешировать.

А если подумает плохо - ей всегда через madvise() можно подсказать, как нужно думать правильно. Прочитать там следующие 128 килобайт заранее или нет
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270658
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schwaУправление памятью на свой страх и риск aka возможность считывания byte/signed/usigned int/float/double/etc с указанной позиции в памяти это конечно хорошо, но толку мало - программы это структуры данных и работа с ними. Поэтому нужна нормальная поддержка указателей на структуры, которые расположены вне хипа с поддержкой на уровне рантайма, языка и его стандартной библиотеки.
Если честно - непонятно. Что за "структуры вне хипа" ? И что за хитрый указатель?
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270660
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaплюс выделение памяти под стек vs резервирование. если резервировать через mmap(), то ...
Под стек тоже резервирование.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270662
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonnojavaпотому стек проще реализовать самому отдельно, благо это вообще не сложно - просто передвигать указатель.

Примерно так и работает Eden-space в Java.

Ну в Java не все сделано дурацким способом, это да. Выделяет память она в принципе разумно. И быстро.
Удаляет хреново.

Java потому и состоялась в web приложениях, что работает примерно так, как я выше описал. Только она не удаляет один большой кусок, она удаляет множество объектов нового поколения, потому не так сильно тупит.

Но если ты не дай бог заточишься на еще объекты старого поколения, будешь там чото-удалять - то тут твоей поделки и кирдык на виртуалке - gс паузы привет.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270668
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaТы опять видать не понял. mmap() - он не загружает файл в память приложения, с чего-бы вдруг?

он просто говорит операционке:

- Слушай, диапазон памяти с 9000 гигабайта по 9230 гигабайт - это отображение файла database.dbf

Если приложение начнет читать что-то с 9101 гигабайта - то оок, берешь подсовываешь ему то, что лежит в 101-м гигабайте файла database.dbf

Ну... про работу buffer pool всем известно. Тут вопрос в другом. Что мы получим если заберём у DBMS
ее драгоценную память кеша блоков и отдатим для приложения? Напоминаю на минуточку что мы шарим
и приложение и DBMS на 1 физическом хосте. И если вы где-то потянули одеяло - то с другой стороны
станет холодно. Напоминаю также что DBMS распоряжалась кешем блоков для операций записи.

И нет ли в этом возврата лет на 30 назад когда многопользовательских DBMS еще толком не было
а все задачи решались ПРИЛОЖЕНИЕМ которое читало dbf-файлы?

Декаденс?
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270670
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonschwaУправление памятью на свой страх и риск aka возможность считывания byte/signed/usigned int/float/double/etc с указанной позиции в памяти это конечно хорошо, но толку мало - программы это структуры данных и работа с ними. Поэтому нужна нормальная поддержка указателей на структуры, которые расположены вне хипа с поддержкой на уровне рантайма, языка и его стандартной библиотеки.
Если честно - непонятно. Что за "структуры вне хипа" ? И что за хитрый указатель?

структуры вне java heap.

это и есть тот самый mmap() - нечто внешнее отображается в память.

ты можешь на диапазон памяти отобразить файл, а можешь отобразить туда вообще что угодно, хоть блин видеокамеру.
тебе нужно изображение в виде raw формата? да берешь просто и читаешь память с указателя такого-то по такой-то, как обычный массив байт. копирование в память при этом не происходит - данные читаются с иного устройства, чем линейки памяти.

собственно в мире C так давно уже все и работает.

никаких отдельных языковых средств не требуется - прочто чтение массива байт и вперед.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270674
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonУ тебя несколько десятков сообщений. И да.. я понимаю что своё настоящее имя ты
тщательно скрыл.
Где же тщательно? Наш старый друг отделалася фиговым листком
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270677
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилmaytonУ тебя несколько десятков сообщений. И да.. я понимаю что своё настоящее имя ты
тщательно скрыл.
Где же тщательно? Наш старый друг отделалася фиговым листком
Не томи! Я тераюсь в догадках!!

P.S. А кто щас не пьет! Назови! Нет я жду! (с) Аркадий Варламыч
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270678
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonnojavaТы опять видать не понял. mmap() - он не загружает файл в память приложения, с чего-бы вдруг?

он просто говорит операционке:

- Слушай, диапазон памяти с 9000 гигабайта по 9230 гигабайт - это отображение файла database.dbf

Если приложение начнет читать что-то с 9101 гигабайта - то оок, берешь подсовываешь ему то, что лежит в 101-м гигабайте файла database.dbf

Ну... про работу buffer pool всем известно. Тут вопрос в другом. Что мы получим если заберём у DBMS
ее драгоценную память кеша блоков и отдатим для приложения? Напоминаю на минуточку что мы шарим
и приложение и DBMS на 1 физическом хосте. И если вы где-то потянули одеяло - то с другой стороны
станет холодно. Напоминаю также что DBMS распоряжалась кешем блоков для операций записи.

И нет ли в этом возврата лет на 30 назад когда многопользовательских DBMS еще толком не было
а все задачи решались ПРИЛОЖЕНИЕМ которое читало dbf-файлы?

Декаденс?

чего-то холодно? в базе данных MVCC. т.е. если ты изменяешь запись, то она не перезаписывается, а добавляется в виде нового
экземпляра, и указатель памяти на старое значение client.name остается валидным, ну до тех пор, пока приложения не скажут -
знаешь, друк, а нам уже не нужны данные по состоянию на час назад, все, что час назад было уже типо обновлено, можешь
начать использовать повторно.

это совсем иное, чем .dbf, там запись была в абсолютных координатах, без всякого MVCC, и приложениям нужно было ставить
блокировки на чтение, чтоб не потерять консистентность.

А тут консистентность достигается нулевыми затратами, только по причине MVCC - потому что операция "перезаписать" заменена на операцию "добавить новую версию".

а так да, приложение и база данных должны быть на одном хосте. вернее в одном адресном пространстве, так вообще через mmap() можно и удаленные файлы, которые лежат на NFS томе или на SAN-е шарятся между нодами - никто такое не запрещат.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270701
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaчего-то холодно? в базе данных MVCC. т.е. если ты изменяешь запись, то она не перезаписывается, а добавляется в виде нового
экземпляра, и указатель памяти на старое значение client.name остается валидным, ну до тех пор, пока приложения не скажут -
знаешь, друк, а нам уже не нужны данные по состоянию на час назад, все, что час назад было уже типо обновлено, можешь
начать использовать повторно.

это совсем иное, чем .dbf, там запись была в абсолютных координатах, без всякого MVCC, и приложениям нужно было ставить
блокировки на чтение, чтоб не потерять консистентность.

А тут консистентность достигается нулевыми затратами, только по причине MVCC - потому что операция "перезаписать" заменена на операцию "добавить новую версию".

а так да, приложение и база данных должны быть на одном хосте. вернее в одном адресном пространстве, так вообще через mmap() можно и удаленные файлы, которые лежат на NFS томе или на SAN-е шарятся между нодами - никто такое не запрещат.
Друг. Ты что-то путаешь MVCC - это классический набор фич как Oracle и MSSQL.

Только дальше ты ошибаешся:
то она не перезаписывается
Перезаписывается еще как! Это я тебе как бывш. Ораклоид говорю. И как раз для поддержки
снапшотов (курсоров) и используются ROWSCN которые проверяются при каждом чтении строки
и роутятся в UNDO-сегмент если запись была уже модифицирована.

Но ТЫ рассказываешь не этот алгоритм. Ты повествуешь примерно о том как работает Event Store!
https://geteventstore.com/ А это другая тема чувак! Совсем другая!
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270707
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДруг. Ты что-то путаешь MVCC - это классический набор фич как Oracle и MSSQL.
Какая замшелая безграмотность, госпаде. MVCC это просто принцип https://ru.wikipedia.org/wiki/MVCC
а то, что я описал - это давно доступно в базе данных LightningDB. https://symas.com/products/lightning-memory-mapped-database/
которая работает именно как библиотека к прилоежнию, без всяких там серверов баз данных.

тупо .lib, открываешь файл баз данных, и вперед - полный ACID и MVCC, всё по взрослому.
и да - отображение файла в память через mmap(), возможность возвращать просто указатель на запись, без копирований - она потому и адски быстра, что сделано вот так.

maytonТолько дальше ты ошибаешся:
то она не перезаписывается
Перезаписывается еще как! Это я тебе как бывш. Ораклоид говорю. И как раз для поддержки
снапшотов (курсоров) и используются ROWSCN которые проверяются при каждом чтении строки
и роутятся в UNDO-сегмент если запись была уже модифицирована.

Но ТЫ рассказываешь не этот алгоритм. Ты повествуешь примерно о том как работает Event Store!
https://geteventstore.com/ А это другая тема чувак! Совсем другая!

Oracle реализует MVCC несколько иначе, чем к примеру Firebird или вот упомянутая выше LightningDB.
Oracle перетирает данные на месте, а многоверсионность обеспечивает тем, что старые версии складывает отдельно в UNDO.

Firebird и LMDB работают иначе - они не используют UNDO вообще, а просто добавляют новую запись при каждом изменении, ну и потом отдельно повторно используют старые версии записей, пишет туда новые данные, когда в них, в старых версиях, никто не нуждается.

MVCC и там и там, сделано по-разному, но в итоге многоверсионность обеспечена, чо еще надо-то?
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270711
vitprof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я бы добавил:

Низкие расходы на выделение памяти под объект

Возможность управлять GC программно (запускать с указанием максимальной продолжительности)

Низкие расходы на доступ к памяти (для полноты картины)
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270716
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaКакая замшелая безграмотность, госпаде. MVCC это просто принцип https://ru.wikipedia.org/wiki/MVCC
а то, что я описал - это давно доступно в базе данных LightningDB. https://symas.com/products/lightning-memory-mapped-database/
которая работает именно как библиотека к прилоежнию, без всяких там серверов баз данных.

Ну уж извините. Зарос я мхом...

А про эти ваши Лайтманы и прочие Рабиновичи - слышу нечасто. Да и хде они в рэйтингах
и бенчмарках? Хде они в обзорах? Хде имплементированы? Награждены Орденом Ленина?
Увековечены в монографиях?

Или .... речь идет (мне даже страшно предположить) о некоем новом .... FVMAS?
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270722
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitprofЯ бы добавил:

Низкие расходы на выделение памяти под объект


В большинстве GC - уже учтено. Реально выделение происходит как в queue.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270725
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitprofНизкие расходы на доступ к памяти (для полноты картины)

Тут не совсем понятно.

Например если аллоцирован array[] на 10 элементов то при доступе к индексатору
идет каждый раз проверка на попадение в диапазон.

Это имелось в виду?
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270731
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonnojavaКакая замшелая безграмотность, госпаде. MVCC это просто принцип https://ru.wikipedia.org/wiki/MVCC
а то, что я описал - это давно доступно в базе данных LightningDB. https://symas.com/products/lightning-memory-mapped-database/
которая работает именно как библиотека к прилоежнию, без всяких там серверов баз данных.

Ну уж извините. Зарос я мхом...

А про эти ваши Лайтманы и прочие Рабиновичи - слышу нечасто. Да и хде они в рэйтингах
и бенчмарках? Хде они в обзорах? Хде имплементированы? Награждены Орденом Ленина?
Увековечены в монографиях?

Или .... речь идет (мне даже страшно предположить) о некоем новом .... FVMAS?
там все есть по ссылке. и бенчмарки и примеры использования.

его библиотека реализована просто как тупейшее key-value хранилище, это не совсем база данных с SELECTами и прочем.
есть обертка в виде sqlite, но то такое....


вот тебе синтетические тесты: http://lmdb.tech/bench/microbench/
вот примеры применения: https://en.wikipedia.org/wiki/Lightning_Memory-Mapped_Database#Application_Support

хотя какой-то чувак с highload 2014 весьма скептически отзывался, лень искать доклад, но типо есть чего еще допиливать в части безотказности при вырубании по питанию
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270738
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojava, ОК. Спасибо.

Но давай не уклоняться от темы. На правах топик стартера я предагаю
вернуться к обсуждению идеального GC.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270739
vitprof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonvitprofНизкие расходы на доступ к памяти (для полноты картины)

Тут не совсем понятно.

Например если аллоцирован array[] на 10 элементов то при доступе к индексатору
идет каждый раз проверка на попадение в диапазон.

Это имелось в виду?

В частности, да. В общем, могут быть какие-то блокировки в случае многопоточности. Пример - C++ smart_ptr. Мы же общие требования формулируем!?
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270744
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitprofВ частности, да. В общем, могут быть какие-то блокировки в случае многопоточности. Пример - C++ smart_ptr. Мы же общие требования формулируем!?
ОК. Обобщим!

Поменьше блокирующих структур. Больше операций на основе atomic и CAS.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270749
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonnojava, ОК. Спасибо.

Но давай не уклоняться от темы. На правах топик стартера я предагаю
вернуться к обсуждению идеального GC.

так там и есть идеальный GC, в чем вопрос-то?
тебе нужны long running objects? отлично - суй их в эту memory mapped database, и пусть они там и живут.

объект живет себе и в базе данных и в оперативке одновременно, никакая хрень вроде Hibernate вообще не нужна - все уже зампаплено в базу данных изначально, красота.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270764
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaобъект живет себе и в базе данных и в оперативке одновременно, никакая хрень вроде Hibernate вообще не нужна - все уже зампаплено в базу данных изначально, красота.
Да признаю что нулевые расходы на копирование - это привлекательно.

Но такое решение не скейлится. Оно изначально проектируется под 1 хост и целиком
и полностью зависит от перформанса 1 вычислительного узла.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270779
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonnojavaобъект живет себе и в базе данных и в оперативке одновременно, никакая хрень вроде Hibernate вообще не нужна - все уже зампаплено в базу данных изначально, красота.
Да признаю что нулевые расходы на копирование - это привлекательно.

Но такое решение не скейлится. Оно изначально проектируется под 1 хост и целиком
и полностью зависит от перформанса 1 вычислительного узла.

как уже говорилось - NAS и SAN никто не отменял, это раз, а два - если скейлить, то все равно нужно базу данных шардить, потому там просто шардится все целиком - и приложение и база данных бьется на две части, и вперед, в чем проблема-то?

или ты видел приложения, в которых можно оставить один сервер баз данных, но добавить 1024 серверов приложений вместо одного, и все не будет тормозить? да неужели?
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270846
uid unique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все GC используют процессор для чистки, больше памяти на том же процессоре значит дольше будет идти чистка.
Как ни тужься но упрешься в поиск в несортированном массиве рано или поздно.

Нужно переходить на принципиально другой вид памяти, совмещенный с процессором и использовать понятие как удельная процессорная мощность на некоторый объем памяти.

По аналогии с удельным давлением на грунт или удельной мощностью на массу у гусеничных машин.
Хочешь танк потяжелее но с такой же подвижностью и проходимостью? сохраняй удельные параметры.

Идеальная память с удельной процессорной мощностью 1.0 это САМ (Content-addressable memory)
https://en.wikipedia.org/wiki/Content-addressable_memory
Фиксированный по времени поиск в сколько угодно большом несортированном массиве данных.
Как вариант можно делать гибридные решения с обычной памятью (попадались такие платы ускорители для баз данных но давненько это было).
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270896
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как быстро похудеть? - Надо меньше жрать!

Вот и с памятью так.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270897
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uid uniqueИдеальная память с удельной процессорной мощностью 1.0 это САМ (Content-addressable memory)
https://en.wikipedia.org/wiki/Content-addressable_memory
Фиксированный по времени поиск в сколько угодно большом несортированном массиве данных.
Как вариант можно делать гибридные решения с обычной памятью (попадались такие платы ускорители для баз данных но давненько это было).
Мы так далеко уедем. Давайте отложим в сторону.
Эта тема очень интересна но... пожалуйста отдельным топиком.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270901
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonschwaУправление памятью на свой страх и риск aka возможность считывания byte/signed/usigned int/float/double/etc с указанной позиции в памяти это конечно хорошо, но толку мало - программы это структуры данных и работа с ними. Поэтому нужна нормальная поддержка указателей на структуры, которые расположены вне хипа с поддержкой на уровне рантайма, языка и его стандартной библиотеки.
Если честно - непонятно. Что за "структуры вне хипа" ? И что за хитрый указатель?
Вне хипа, который управляется сборщиком мусора.
Указатель - объект доступа к структуре данных. Он может ничем не отличатся от обычного экземпляра класса кроме того, что GC его жизненным циклом не управляет. Но, как было верно замечено, "собственно в мире C так давно уже все и работает. " - т.е. для реализации этого в наш язык со сборщиком нужно реализовать небольшой сабсет C... От чего в принципе хотели уйти - зачем еще GC-то.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270906
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaкак уже говорилось - NAS и SAN никто не отменял, это раз, а два - если скейлить, то все равно нужно базу данных шардить, потому там просто шардится все целиком - и приложение и база данных бьется на две части, и вперед, в чем проблема-то?

Меня конечно поражает легкость с которой жонглируете NAS/SAN и тому подобное. Масштабирование
собственно системы хранения - это сегодня задача уже решенная для R/O. Хеширование и Hadoop в помощь. Но я обращу
внимание на то что когда мы решаем задачи масштабирования в общем понимании этого слова то нам
нужно решать вопросы конкурентных updates.

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

И я вас тоже решительно прошу вернуться к главной теме. А именно к GC.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270911
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Далее я напишу по сабжу. (Рассуждаю пока).

Коли для уборщика мусора представляет сложность сам процесс релокации surival
объектов то разумно заведомо их туда положить. Тоесть классифицировать объекты
по их времени жизни. Разумеется для этого нужно ввести какой-то механизм.

Например аннотации или хинты к new. Например:

Код: java
1.
2.
3.
4.
5.
String fuckenString = @Eden new String("Hello");

XmlDocument fuckenDoc = @OldGen new XmlDocument(Factory.getNewDocument());

Class class = @MetaSpace Class.forName("jdbc.oracle.Driver");



Хинты в зависимости от среды или от компиллятора оставляют за собой право
быть игнорированными. Но разработчик может помечать объекты как долгоживущие
или короткие исходя из своих пониманий целесообразности.

С точки зрения разработчика С++ - стековая аллокация alloca(...) - констатация
того что объект виден в скоупе процедуры и копироваться не будет и должен
быть деаллоцирован сразу после выхода из процедуры. Тоесть по сути это
@Eden new. или

Код: plaintext
1.
/* FAST ALLOC */ mayton::string fuckenString = new mayton::string("Hello");
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39270992
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Одиночный объект ты можешь сунуть в alloca, но STL контейнер уже нет - аллокатор полезет в глобал хип. И там глубока кроличья нора зависимостей.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39271031
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglОдиночный объект ты можешь сунуть в alloca, но STL контейнер уже нет - аллокатор полезет в глобал хип. И там глубока кроличья нора зависимостей.
А можно всем "зависимостям" сказать дескыть - хочу alloca?
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39271043
YesSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonSiemarglОдиночный объект ты можешь сунуть в alloca, но STL контейнер уже нет - аллокатор полезет в глобал хип. И там глубока кроличья нора зависимостей.
А можно всем "зависимостям" сказать дескыть - хочу alloca?
можно
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39271065
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YesSql, у меня сходу нелетает. MinGW 5.30

Код: sql
1.
2.
3.
In file included from example.cpp:1:0:
short_alloc.h:29:58: error: 'max_align_t' is not a member of 'std'
 template <std::size_t N, std::size_t alignment = alignof(std::max_align_t)>
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39271084
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>gcc -std=c++11 small_vector.cpp -lstdc++
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39271089
YesSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonYesSql, у меня сходу нелетает. MinGW 5.30

Код: sql
1.
2.
3.
In file included from example.cpp:1:0:
short_alloc.h:29:58: error: 'max_align_t' is not a member of 'std'
 template <std::size_t N, std::size_t alignment = alignof(std::max_align_t)>


std::max_align_t определена в С++11
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39271122
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YesSqlmaytonпропущено...

А можно всем "зависимостям" сказать дескыть - хочу alloca?
можно
Строго говоря, alloca тут не используется, просто буфер создается на стеке. Это хуже, т.к предварительно ограничивает размер.
Хотя переписать, думаю не составит проблемы.

С другой стороны, тот же Мейерс пишет, что аллокаторы не всегда используются (Совет 10, 11). Хотя книжка старая, может уже починили.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39271143
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я понимаю стека не так много. Тут надо покурить Windows/Linux доки по ОС
и созданию потоков и процессов чтобы понять сколько стека по дефолту
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39271156
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton Идеальный GC должен:

1) Хорошо скейлится. . Тоесть при переходе с 16G кучи до 32G мы не должны
наблюдать "удвоенную" нагрузку на процессы GC.

2) Иметь жестко регулируемый Stop-The-World. . Тоест грубо говоря мы должны
иметь ИНСТРУМЕНТ или регулятор которым мы говорим дескыть - Мы не желаем
чтобы стоп-вселенная длилась более чем 10 милисекунд. Вот так вот.

3) Иметь средства диагностики и отладки . Ну здесь как-бе все ясно. Что. Где. Когда.
Детальный лог по активностям GC.

4) Иметь возможность workaround механизма GC . Как ни крути но есть
ситуации когда мы сами желаем иметь прямой неуправляемый доступ к памяти
и мы требуем чтобы (на свой страх и риск) у нас все таки была возможность
выделять сырую память и удалять ее вручную.

.... здесь можно еще дописать ваши предложения.

Можно также обсудить че есть и где какие алгоритмы используются.

Таблицы и графики - приветствуются.
для некоторых языков, важным пунктом является дешевая(быстрая) операция выделения памяти под маленький объект с короткой жизнью.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39271157
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonvitprofЯ бы добавил:

Низкие расходы на выделение памяти под объект


В большинстве GC - уже учтено. Реально выделение происходит как в queue.
как оказалось, далеко не во всех языках.
ибо не во всех языках, оно столь важно.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39271256
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaAn ultra-fast, ultra-compact, crash-proof key-value embedded data store Я выделил то, что сигнализирует - "дальше можно не читать".
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39271257
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonчтобы понять сколько стека по дефолтуОт мегабайта и выше, если только вы не ядрёный драйвер делаете.
Плюс, может автоматически увеличиваться, если "туды покладено" нечто бОльшее.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39271284
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovmaytonчтобы понять сколько стека по дефолтуОт мегабайта и выше, если только вы не ядрёный драйвер делаете.
Плюс, может автоматически увеличиваться, если "туды покладено" нечто бОльшее.
Мда... если смешивать много malloc и aalloc то у нас будет пухнуть оба сегмента что
в результате скорее всего приведет к нерациональному использованию места.
Лучше уж наверное оставить аллокацию в куче но применить к ней стековые
алгоритмы очистки.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39271293
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЛучше уж наверное оставить аллокацию в куче но применить к ней стековые
алгоритмы очистки.
тогда она рискует из кучи превратиться в стек :)

сейчас плавно придём к тому, что в приложении нужно иметь несколько пулов для разных нужд,
и пулы для короткоживущих данных просто грохать тем или иным способом.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39271295
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилmaytonЛучше уж наверное оставить аллокацию в куче но применить к ней стековые
алгоритмы очистки.
тогда она рискует из кучи превратиться в стек :)

сейчас плавно придём к тому, что в приложении нужно иметь несколько пулов для разных нужд,
и пулы для короткоживущих данных просто грохать тем или иным способом.
Это и есть моё предложение по поводу хинтов к операции new.

По поводу JVM. Я наблюдал ее активности через графики JVisualVM и пришел к следующему.
Есть мысль что необходимо минимизировать миграцию обЪектов Eden->Survival(0|1)->Old.
А чтоб минимизировать нужно фактически детектировать ЧТО за объекты постоянно прыгают
из Эдемского сада в "старички". Или что за алгоритм их продуцирует.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39271308
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНо я обращу
внимание на то что когда мы решаем задачи масштабирования в общем понимании этого слова то нам
нужно решать вопросы конкурентных updates.
у тебя дыра в общего характера знаниях.

все что конкурентно - не масштабируется по определению - чем больше людей ломится в одну дверь, тем хуже с пропускной способностью.
масштабирование - это как раз и есть техника разбиения общей задачи на взаимно изолированные и неконкуретные части.

говоря проще - стройте побольше взаимо независимых дверей.


даже вариант MxN - M серверов приложений на N баз данных - уже тупиковый, потому что каждый сервер баз данных должен поддерживать M сосединений.
сервер приложений и база данных должны иметь связь 1:1 и только, иначе никакого масштабирования не будет, ваш КО

а раз 1:1 - то ... какие претензии к имению одного локального сервера баз данных (а все остальное - уже коммуникации на уровне веб сервисов).

простая же истина
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39271309
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилmaytonЛучше уж наверное оставить аллокацию в куче но применить к ней стековые
алгоритмы очистки.
тогда она рискует из кучи превратиться в стек :)

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

ура, кажется кто-то начал что-то подозревать :)
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39271310
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИзопропилпропущено...

тогда она рискует из кучи превратиться в стек :)

сейчас плавно придём к тому, что в приложении нужно иметь несколько пулов для разных нужд,
и пулы для короткоживущих данных просто грохать тем или иным способом.
Это и есть моё предложение по поводу хинтов к операции new.

По поводу JVM. Я наблюдал ее активности через графики JVisualVM и пришел к следующему.
Есть мысль что необходимо минимизировать миграцию обЪектов Eden->Survival(0|1)->Old.
А чтоб минимизировать нужно фактически детектировать ЧТО за объекты постоянно прыгают
из Эдемского сада в "старички". Или что за алгоритм их продуцирует.

твои хинты не имеют никакого смысла. долгоживущие объекты тоже чистить нужно, понятие долгоживучести оно такое, ну не миллисекунды, секунды, тем не менее.
простейший случай - внутренняя "база данных", приложение поддерживает некий внутренний мир, заселенный взаимодействующими объектами, а процессы вебсервисы просто дергают события этого мира.

ну так эти объекты-в мирке тоже умирают иногда, как их чистить-то, если их - сотни гигабайт?


хотя идея о неком анализаторе, когда объект по природе краткоживущий вдруг перекочевал в долгоживущие - это да.
ну так это и самому можно сделать, завести себе timestamp поле, и анализировать его время от времени, вываливая в лог ругань при превышении нормативного времени жизни в чем проблема-то?
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39271332
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaхотя идея о неком анализаторе, когда объект по природе краткоживущий вдруг перекочевал в долгоживущие - это да.
ну так это и самому можно сделать, завести себе timestamp поле, и анализировать его время от времени, вываливая в лог ругань при превышении нормативного времени жизни в чем проблема-то?
Давай исходить из предположения что у меня неизвестное приложение. Про БД и ORM - ничего не известно.
И я использую закрытые сущности из других библиотек. И куда я буду добавлять этот
timestamp? И каким образом? Расширить? Инкапсулировать? В какой момент времени
и кто будет проверять этот timestamp?

Я не против анализатора но мне неясен механизм.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39271334
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaу тебя дыра в общего характера знаниях.

все что конкурентно - не масштабируется по определению - чем больше людей ломится в одну дверь, тем хуже с пропускной способностью.
масштабирование - это как раз и есть техника разбиения общей задачи на взаимно изолированные и неконкуретные части.

говоря проще - стройте побольше взаимо независимых дверей.


даже вариант MxN - M серверов приложений на N баз данных - уже тупиковый, потому что каждый сервер баз данных должен поддерживать M сосединений.
сервер приложений и база данных должны иметь связь 1:1 и только, иначе никакого масштабирования не будет, ваш КО

а раз 1:1 - то ... какие претензии к имению одного локального сервера баз данных (а все остальное - уже коммуникации на уровне веб сервисов).

простая же истина
Чувак эта тема очень интересная - но я тебя прошу. Отдельным топиком. Поднимай тему и задавай свой вопрос.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39271339
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЧувак эта тема очень интересная - но я тебя прошу. Отдельным топиком. Поднимай тему и задавай свой вопрос.

Все что тебе нужно сделать - это самому себе - "да, я вообще не разбираюсь в масштабировании". И никаких отдельных топиков не нужно.
Другим это понятно уже давно :)
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39271341
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonnojavaхотя идея о неком анализаторе, когда объект по природе краткоживущий вдруг перекочевал в долгоживущие - это да.
ну так это и самому можно сделать, завести себе timestamp поле, и анализировать его время от времени, вываливая в лог ругань при превышении нормативного времени жизни в чем проблема-то?
Давай исходить из предположения что у меня неизвестное приложение. Про БД и ORM - ничего не известно.
И я использую закрытые сущности из других библиотек. И куда я буду добавлять этот
timestamp? И каким образом? Расширить? Инкапсулировать? В какой момент времени
и кто будет проверять этот timestamp?

Я не против анализатора но мне неясен механизм.

С закрытыми сущностями конечно печаль печаль. А так - я тебе просто описал подход, принятый в известных мне успешных проектах с долговременным хипом на сотни гигабайт. Они вообще ничего никогда не чистят долговременное, вместо этого они просто хранят объекты вечно, выставляя булевый флаг поле deleted и принудительно выставляя жесткую ссылку на объект, которая не позволит сбросить счетчик в ноль никогда.

А очистка происходит ествественным путем - на выходных сервер перезагружается, память чистится так сказать естественным путем.

Java она такая java.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39271460
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМда... если смешивать много malloc и aalloc то у нас будет пухнуть оба сегментаЗабудьте про сегменты.
Если исключить экзотику вроде DOS и той же OS/2, CS == DS == SS == FS.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39271511
GCjavaABA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У сборщика мусора в Java есть одно серьёзное преимущество - не нужны hazard pointers для реализации Lock-free алгоритмов, т.к. не возникает ABA-проблемы за исключением редких случаев. Это актуально для архитектур типа x86_64, где нет LL/SC операций.
Для всего остального по всем параметрам лучше или memory-reuse, или детерминированное освобождение памяти через smart-pointers.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39273717
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На хабре статья вышла про эволюцию сборщика мусора в Go

У меня вопрос появился: почему никто не развивает работу со счетчиками ссылок? Или как там оно правильно называется. По сути как смарт-указатели из С++. Еще WinAPI использует для работы с объектами ядра.
Технически реализация не сложная: присвоил ссылку на объект переменной сделал Счетчик++, освободил - Счетчик--. Получил 0, запустил деструктор.
Плюсы очевидны:
1. Объект уничтожается именно тогда, когда он стал не нужен, т.е. можно управлять этим процессом, не получая остановку проги сборщиком в самый напряженный момент.
2. Возможен полноценный деструктор, а не малоприменимое недоразумение в виде финализатора, который неизвестно когда будет вызван сборщиком мусора.
Минусы:
1. Постоянное изменение счетчика. Плюс надо атомарность соблюдать, т.к. сейчас все ЯП многопоточные.
2. Память под счетчик. 4 байта на объект может быть критично при большом количестве маленьких объектов.

По моему минусы не такие уж и серьезные. Но, как понимаю они перевешивают плюсы раз большинство ЯП используют сборку мусора.
Теоретически в любом ЯП со сборщиком мусора можно безболезненно заменить его на использование счетчиков ссылок, и это никак не потребует переписывания кода на этом ЯП, но никто не пытается. Интересно почему?
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39273769
GCjavaABA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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)
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39273781
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GCjavaABAА как GC считает количество ссылок, он без счетчиков, по стеку каждого потока бегает?
бегает. и за процессорными регистрами следит
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39273811
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GCjavaABAА как GC считает количество ссылок, он без счетчиков, по стеку каждого потока бегает?
Глубоко не вникал, но как понимаю у GC нет необходимости знать сколько ссылок на объект, достаточно флага: есть ссылки/нет ссылок.

GCjavaABAиспользует медленные CAS-операции - ядро CPU замирает на 1000 тактов
Как вариант: две lock-free очереди, в одну пишем указатель на объект для увеличения счетчика, во вторую уменьшение и отдельный поток на разгребание этих очередей. Только у него доступ ко всем счетчикам. Тогда не надо никакой атомарности. Можно общую очередь сделать, писать туда указатель и флаг +/-. Правда при таком подходе теряем полноценный деструктор, т.к. все равно будет задержка и запуск в другом потоке.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39273812
GCjavaABA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ИзопропилGCjavaABAА как GC считает количество ссылок, он без счетчиков, по стеку каждого потока бегает?
бегает. и за процессорными регистрами следит
А есть возможность вызвать функцию принудительного сбора мусора?
И есть ли возможность (вручную указывать) заносить ссылки в разные сегменты сборщика мусора, чтобы очищать только заданные сегменты?
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39273820
GCjavaABA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 тактов), в чем профит?
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39273822
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TGCjavaABAиспользует медленные CAS-операции - ядро CPU замирает на 1000 тактов
Как вариант: две lock-free очереди, в одну пишем указатель на объект для увеличения счетчика, во вторую уменьшение и отдельный поток на разгребание этих очередей. Только у него доступ ко всем счетчикам. Тогда не надо никакой атомарности. Можно общую очередь сделать, писать туда указатель и флаг +/-. Правда при таком подходе теряем полноценный деструктор, т.к. все равно будет задержка и запуск в другом потоке.
Фигню я придумал. В основе lock-free теже атомарные операции. Т.е. никакой разницы в очередь писать или сразу счетчик менять.
Надо затестить правда ли они такие тормозные.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39273832
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TDima Tпропущено...

Как вариант: две lock-free очереди, в одну пишем указатель на объект для увеличения счетчика, во вторую уменьшение и отдельный поток на разгребание этих очередей. Только у него доступ ко всем счетчикам. Тогда не надо никакой атомарности. Можно общую очередь сделать, писать туда указатель и флаг +/-. Правда при таком подходе теряем полноценный деструктор, т.к. все равно будет задержка и запуск в другом потоке.
Фигню я придумал. В основе lock-free теже атомарные операции. Т.е. никакой разницы в очередь писать или сразу счетчик менять.
Надо затестить правда ли они такие тормозные.
Если атомарный декремент сделать отложенной операцией то мы можем получить парадокс когда
счетчик ссылок может быть отрицательным.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39273842
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЕсли атомарный декремент сделать отложенной операцией то мы можем получить парадокс когда
счетчик ссылок может быть отрицательным.
Это легко решается: проверять значения счетчиков когда пуста очередь плюсования.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39273847
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TФигню я придумал. В основе lock-free теже атомарные операции. Т.е. никакой разницы в очередь писать или сразу счетчик менять.
Надо затестить правда ли они такие тормозные.
Там даже не в атомарности дело, а в том что как только возникает второй поток, то это ничем не лучше GC, потому что имеет все те же недостатки что и GC (в частности асинхронность удаления), в добавок к недостаткам смартуказателей ))

Вообще кроме перечисленных выше недостатков смартуказателей самый главный это невозможность автоматического отслеживания циклических ссылок.
Поэтому в языках где поставлена задача минимизировать мысли программиста и делают GC а не смартуказатели. Считается что программист не способен выбрать между shared_ptr и weak_ptr чтобы вручную убрать циклы. Вероятно создатели этих языков судят по себе
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39273864
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyТам даже не в атомарности дело, а в том что как только возникает второй поток, то это ничем не лучше GC, потому что имеет все те же недостатки что и GC (в частности асинхронность удаления), в добавок к недостаткам смартуказателей ))
Лучше хотя бы тем что поток полностью асинхронный и не требует прерывания основного. С ядрами нынче проблем нет. В основном проблемы чем бы их занять.

Anatoly MoskovskyВообще кроме перечисленных выше недостатков смартуказателей самый главный это невозможность автоматического отслеживания циклических ссылок.
Это я как-то упустил. Тоже серьезный минус при кривых руках :)
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39273874
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько вообще проблема циклических ссылок актуальна?

Ну... не в рамках теоретических рассуждений. А из практики.
Кто может сказать что он напоролся на Cyclic reference и к
чему это приводило?
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39273903
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНасколько вообще проблема циклических ссылок актуальна?

Ну... не в рамках теоретических рассуждений. А из практики.
Кто может сказать что он напоролся на Cyclic reference и к
чему это приводило?
Я в фокспро натыкался: независимая работа нескольких форм, причем каждая хранить ссылку на контрол другой чтобы при закрытии туда перевести фокус. При закрытии одной из форм фокс завешивался намертво. Пришлось свой антизацикливатель писать.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39274136
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЛучше хотя бы тем что поток полностью асинхронный и не требует прерывания основного. С ядрами нынче проблем нет. В основном проблемы чем бы их занять.
1) Для GC необязательно останавливать потоки.
2) Асинхронность означает, что возможны ситуации нехватки памяти только из-за того что очищающий поток не успевает ее очистить (а не потому что алгоритм неоптимальный или памяти мало). Собственно это основная претензия к GC.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39274932
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИнтересно почему?Вы уже научились гарантировать ацикличность графа ссылок?
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39274933
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovDima TИнтересно почему?Вы уже научились гарантировать ацикличность графа ссылок?
Как бы уже обсудили цикличные ссылки.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39274934
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TКак бы уже обсудили цикличные ссылки.Я настолько удивился, что этот вопрос не был первым, что даже не дочитал до начала обсуждения.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39274937
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovDima TКак бы уже обсудили цикличные ссылки.Я настолько удивился, что этот вопрос не был первым, что даже не дочитал до начала обсуждения.
в начале это не упоминалось. Ты не почитал ответы на процитированный вопрос, т.е. недочитав начал повторять то что уже сказано. Сначала дочитывай топик, потом уже можно вопросом на вопрос. Ладно проехали.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39275132
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Затестил счетчики, результаты печальные, понятно почему от них отказались

исходникMS VC 2015 Express
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <time.h>

#include<windows.h>

#include <atomic>
#include <thread>

int cnt = 0;
std::atomic<int> acnt = 0;

void testint() {
	int t = clock();
	while(1) {
		cnt++;
		if(cnt == 0) {
			printf("test int %d ms\n", clock() - t);
			break;
		}
	}
}

void testatomic() {
	int t = clock();
	while (1) {
		acnt++;
		if (acnt == 0) {
			printf("test atomic %d ms\n", clock() - t);
			break;
		}
	}
}

void main() {
	testint();
	testatomic();
	printf("multithread\n");
	std::thread t1(testatomic);
	std::thread t2(testatomic);
	std::thread t3(testatomic);
	t1.join();
	t2.join();
	t3.join();
}


Результатtest int 1074 ms // однопоточно
test atomic 33306 ms // однопоточно
multithread
test atomic 93025 ms // первый из 3х потоков
test atomic 181792 ms
test atomic 215049 ms

Счетчик из просто int в 33 раза быстрее std::atomic<int> и в 90 раз быстрее если второй используется несколькими потоками. Потоки честно распределились по разным ядрам, диспетчер задач показывал общую загрузку 76-77% для 4х ядер. С двумя потоками результаты такие же.

В общем это вообще не вариант для многопототочных ЯП.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39275133
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХУ, по результатам тестов, lock-free алгоритмы тоже не очень перспективное направление развития
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39275141
lockfree
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TИМХУ, по результатам тестов, lock-free алгоритмы тоже не очень перспективное направление развития
По каким тестам и какие алгоритмы?
ordered map более менее масштабируются, а unordered map вообще хорошо
https://habrahabr.ru/post/251267/
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39275147
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lockfree, нездоровая картинка, начинается с 2-х а не одного потока, как туда смог попасть std::map вообще непонятно, он не потокобезопасный, мутексом наверно обернули. Потом давай эту картинку растянем на нормальную шкалу, где нет 8-4 = 32-16 и увидим что все равно каждый график уходит в горизонтальную прямую.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39275148
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lockfreeПо каким тестам и какие алгоритмы?
Исходники я выложил 19419141 в отличие от автора картинки.
...
Рейтинг: 0 / 0
Тяпничный идеальный сборщик мусора
    #39275152
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lockfreeordered map более менее масштабируются, а unordered map вообще хорошо
Давай код, затестим. Я не утверждаю что мои тесты идеальны, но разница почти на два порядка напрягает.
...
Рейтинг: 0 / 0
87 сообщений из 87, показаны все 4 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Тяпничный идеальный сборщик мусора
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]