Java без сборки мусора
От: cppguard  
Дата: 24.01.22 16:32
Оценка:
Подскажите, по какому запросу можно найти информацию по следующим вопросам:
1. Запускается ли сборщик мусора (для разных реализаций GC), если память не выделяется (перестаёт выделяться)?
2. Использование J2SE на платформах с ограниченными ресурсами.
3. Использование Epsilon GC в реальных проектах.

Насчёт последнего стоит уточнить. Вопрос в том, не "течёт" ли сама JVM в том плане, что не происходит ли выделения памяти где-то в недрах, даже если на прикладном уровне потребление памяти остаётся неизменным?
Re: Java без сборки мусора
От: StanislavK Великобритания  
Дата: 24.01.22 16:55
Оценка: 6 (1)
Здравствуйте, cppguard, Вы писали:

C>Подскажите, по какому запросу можно найти информацию по следующим вопросам:

Это вопрос про гугление?

C>1. Запускается ли сборщик мусора (для разных реализаций GC), если память не выделяется (перестаёт выделяться)?

насчет этого нет никаких гарантий. Хотя, в общем случае это так. У меня не было случая, чтобы когда ничего не выделяется он почему-то включился. На всякий случай еще стоит выключить System.gc() (XX:+DisableExplicitGC) По-началу, кстати, он обычно несколько раз все же вызывается, ему надо устаканиться немного.

C>2. Использование J2SE на платформах с ограниченными ресурсами.

Я не встречал, чтобы был какой-то комьюнити на эту тему...

C>3. Использование Epsilon GC в реальных проектах.

в чем проблема его использования?

C>Насчёт последнего стоит уточнить. Вопрос в том, не "течёт" ли сама JVM в том плане, что не происходит ли выделения памяти где-то в недрах, даже если на прикладном уровне потребление памяти остаётся неизменным?

Если вопрос в том, может ли JVM сама выделить память для чего-то, то думаю, что может, но чтобы точно знать надо в сырцах порыться, поискать malloc и все такое. В целом, мне кажется, что все как обычно — по-началу повыделяет, потом успокоиться и будет тихо сидеть.
Re[2]: Java без сборки мусора
От: StanislavK Великобритания  
Дата: 24.01.22 17:13
Оценка:
Здравствуйте, StanislavK, Вы писали:

SK>Здравствуйте, cppguard, Вы писали:


C>>Подскажите, по какому запросу можно найти информацию по следующим вопросам:

SK>Это вопрос про гугление?

Есть немного на реддите:

https://www.reddit.com/r/java/comments/5u1q52/epsilon_gc_the_arbitrarily_low_overhead_garbage/
https://www.reddit.com/r/java/comments/le6do1/are_you_interested_in_learning_about_low_latency/

Еще вот ожидаемо, но как обычно только когда уже прочитаешь
https://stackoverflow.com/questions/58087596/why-are-repeated-memory-allocations-observed-to-be-slower-using-epsilon-vs-g1/58292061#58292061
Re[2]: Java без сборки мусора
От: cppguard  
Дата: 24.01.22 17:16
Оценка:
Здравствуйте, StanislavK, Вы писали:

SK>Это вопрос про гугление?

Да, про ключевые слова, по которым можно найти информацию по теме.

SK>Я не встречал, чтобы был какой-то комьюнити на эту тему...

Тут и там, на конференциях и блогах проскакивают темы про Java + HFT, но со стороны понять полную картину трудно. Обычно, всё ограничивается информацией вида "вот тут мы заменили HashSet на нашу хитрую структуру данных, и всё стало летать". А вот вопросы типа latency или determinism остаются в стороне. Возможно, конечно, в HFT оптимизируют для high throughput, и latency вообще не важна. А ещё Гослинг работал в проекте по разработке автономных роботов на Java, но найти какую-либо информацию не получается

SK>в чем проблема его использования?

Просто интересно было бы почитать реальные отзывы.
Re[3]: Java без сборки мусора
От: StanislavK Великобритания  
Дата: 24.01.22 17:34
Оценка: +1
Здравствуйте, cppguard, Вы писали:

SK>>Я не встречал, чтобы был какой-то комьюнити на эту тему...

C>Тут и там, на конференциях и блогах проскакивают темы про Java + HFT, но со стороны понять полную картину трудно. Обычно, всё ограничивается информацией вида "вот тут мы заменили HashSet на нашу хитрую структуру данных, и всё стало летать". А вот вопросы типа latency или determinism остаются в стороне. Возможно, конечно, в HFT оптимизируют для high throughput, и latency вообще не важна. А ещё Гослинг работал в проекте по разработке автономных роботов на Java, но найти какую-либо информацию не получается

Java + HFT, это не про ограниченные ресурсы. Обычно машинки очень и очень мощные. GC не используется по причине добавления latency в непредсказуемый момент. Важны именно связка high throughput и latency, я не могу представить почему кто-то оставляет это в стороне


SK>>в чем проблема его использования?

C>Просто интересно было бы почитать реальные отзывы.
в HFT я бы его не использовал, потому, что мне кажется что с ним будет только запутаннее. Что с ним, что без него, "new" вызывать нельзя, так, что какой-то серьезной пользы от него я не вижу.
Re[3]: Java без сборки мусора
От: · Великобритания  
Дата: 24.01.22 22:00
Оценка:
Здравствуйте, cppguard, Вы писали:

c> SK>Я не встречал, чтобы был какой-то комьюнити на эту тему...

c> Тут и там, на конференциях и блогах проскакивают темы про Java + HFT, но со стороны понять полную картину трудно.
Потому что она у всех разная. Надо запускать под профайлером и отслеживать нагрузку на память/gc при типичной прод нагрузке.
В hft берут какой-нибудь azul gc и он даёт некие гарантии на latency.
Написать приложение полностью zero-gc думаю реально, но очень непрактично. Удобнее вылизать один главный latency-sensitive поток, чтобы он не выделял память вообще, а остальные могут кушать понемногу.
Само по себе в jvm ничего не делается. Однако, например, можно неожиданно подлючиться к jvm через какой-нибудь jconsole jmx и внезапно у тебя что-то навыделяется.

На прошлой работе был hft matching engine приложение. Там gc был, но он срабатывал раз в день, или даже реже, не помню деталей.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: Java без сборки мусора
От: Максим Россия  
Дата: 03.02.22 09:28
Оценка: +1
·>В hft берут какой-нибудь azul gc и он даёт некие гарантии на latency.
·>Написать приложение полностью zero-gc думаю реально, но очень непрактично. Удобнее вылизать один главный latency-sensitive поток, чтобы он не выделял память вообще, а остальные могут кушать понемногу.
·>Само по себе в jvm ничего не делается. Однако, например, можно неожиданно подлючиться к jvm через какой-нибудь jconsole jmx и внезапно у тебя что-то навыделяется.

Вспомнилась какая-то лекция Романа Елизарова где он рассказывал про то, как они писали торговоую платформу. Там что-то похожее было применено, выделялся большой массив интов/лонгов (чуть ли не через unsafe, не помню деталей) и в этом массиве хранились текущиие котировки в определенном бинарном формате. Это позволяло не создавать миллиарды джава объектов с минимальным временем жизни и тем самым снижалась нагрузка на GC.
Errare humanum est
Re[5]: Java без сборки мусора
От: vsb Казахстан  
Дата: 13.02.22 09:18
Оценка:
Здравствуйте, Максим, Вы писали:

М>Вспомнилась какая-то лекция Романа Елизарова где он рассказывал про то, как они писали торговоую платформу. Там что-то похожее было применено, выделялся большой массив интов/лонгов (чуть ли не через unsafe, не помню деталей) и в этом массиве хранились текущиие котировки в определенном бинарном формате. Это позволяло не создавать миллиарды джава объектов с минимальным временем жизни и тем самым снижалась нагрузка на GC.


Ещё GC может захотеть подвигать объекты. Даже если это один массив интов на 100 мегабайтов. Поэтому и выделяют через unsafe, чтобы GC к нему вообще не притрагивался.
Re[5]: Java без сборки мусора
От: cppguard  
Дата: 13.02.22 11:44
Оценка:
Здравствуйте, Максим, Вы писали:

М>Вспомнилась какая-то лекция Романа Елизарова где он рассказывал про то, как они писали торговоую платформу. Там что-то похожее было применено, выделялся большой массив интов/лонгов (чуть ли не через unsafe, не помню деталей) и в этом массиве хранились текущиие котировки в определенном бинарном формате. Это позволяло не создавать миллиарды джава объектов с минимальным временем жизни и тем самым снижалась нагрузка на GC.


Ага, помню ту лекцию. Я её раза три пересматривал, чтобы разглядеть конкретику.
Re[6]: Java без сборки мусора
От: StanislavK Великобритания  
Дата: 15.02.22 08:03
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Ещё GC может захотеть подвигать объекты. Даже если это один массив интов на 100 мегабайтов. Поэтому и выделяют через unsafe, чтобы GC к нему вообще не притрагивался.

Да не, не будет он двигать такие большие объекты, в этом смысла нет, есть только недостатки.
Через unsafe, мы выделяли потому, что иначе кусок байт больше 2Gb не выделить. Ну и хип все же добавляет какой-то оверхэд, если делать его большим — проще не заморачиваться.
Re[6]: Java без сборки мусора
От: Infernal Россия  
Дата: 22.02.22 15:52
Оценка:
Здравствуйте, cppguard, Вы писали:

C>Ага, помню ту лекцию. Я её раза три пересматривал, чтобы разглядеть конкретику.


А задачу то какую пытаетесь решить? Может с этой стороны попробовать зайти
Re[7]: Java без сборки мусора
От: cppguard  
Дата: 02.03.22 21:29
Оценка:
Здравствуйте, Infernal, Вы писали:

I>А задачу то какую пытаетесь решить? Может с этой стороны попробовать зайти


Использования Java для критически важных задач, там, где нужно обеспечить полную или квази- детерминированность: роботы, встраиваемые системы.
Re[8]: Java без сборки мусора
От: Infernal Россия  
Дата: 03.03.22 08:28
Оценка:
Здравствуйте, cppguard, Вы писали:

C>Здравствуйте, Infernal, Вы писали:


I>>А задачу то какую пытаетесь решить? Может с этой стороны попробовать зайти


C>Использования Java для критически важных задач, там, где нужно обеспечить полную или квази- детерминированность: роботы, встраиваемые системы.


А почему бы в этих критических местах просто просто бы не уйти в натив и POSIX?
Не важно как, JNI, GraalVM native (если 64 бит) или JNA. И дальше общаемся держа указатели на места не очищаемой памяти.

Квази — это сколько? Обычно паузы в нормально настроенном приложении, которое не плодит мусор, занимает миллисекунды.
Re[9]: Java без сборки мусора
От: cppguard  
Дата: 03.03.22 20:39
Оценка:
Здравствуйте, Infernal, Вы писали:

I>А почему бы в этих критических местах просто просто бы не уйти в натив и POSIX?

I>Не важно как, JNI, GraalVM native (если 64 бит) или JNA. И дальше общаемся держа указатели на места не очищаемой памяти.

Можно, конечно, но зачем мне тогда Java?

I>Квази — это сколько? Обычно паузы в нормально настроенном приложении, которое не плодит мусор, занимает миллисекунды.


Квази это когда есть непредсказуемые паузы, но длятся они не больше заранее известного времени. Например, процесс управляет манипулятором, публикуя в шине CAN следующие опорные точки. Контроллер манипулятора требует, чтобы точки публиковались каждые 50мс. И если алгоритм тратит 1мс на работу, то 49мс у нас есть в запасе.
Re[10]: Java без сборки мусора
От: · Великобритания  
Дата: 03.03.22 21:31
Оценка:
Здравствуйте, cppguard, Вы писали:

c> I>А почему бы в этих критических местах просто просто бы не уйти в натив и POSIX?

c> I>Не важно как, JNI, GraalVM native (если 64 бит) или JNA. И дальше общаемся держа указатели на места не очищаемой памяти.
c> Можно, конечно, но зачем мне тогда Java?
Писать высокоровневую бизнес-логику.

c> I>Квази — это сколько? Обычно паузы в нормально настроенном приложении, которое не плодит мусор, занимает миллисекунды.

c> Квази это когда есть непредсказуемые паузы, но длятся они не больше заранее известного времени. Например, процесс управляет манипулятором, публикуя в шине CAN следующие опорные точки. Контроллер манипулятора требует, чтобы точки публиковались каждые 50мс. И если алгоритм тратит 1мс на работу, то 49мс у нас есть в запасе.
Ну 50мс это в принципе дофига. Ты пробовал, замерял? Полагаю, что простой код без проблем обеспечит такие тайминги без особых напрягов.
Самый первый шаг — вооружиться перформанс-тестами и средствами мониторинга перформанса, чтобы искать проблемы, выяснять их причину и искать пути устранения, проверяя успешность путей тестами.
Надо уметь искать источник задержек. Это ведь может быть не только gc, но и железо, и операционка.

Обычно в приложении выделяется "главный" тред, который будет gc-free и обеспечивать чувствительную к задержкам логику. А другие треды могут обслуживать главный. Например, выделять память в вспомогательном треде и передавать её через volatile-переменную в главный.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[11]: Java без сборки мусора
От: Infernal Россия  
Дата: 04.03.22 06:17
Оценка:
Здравствуйте, ·, Вы писали:

·>Здравствуйте, cppguard, Вы писали:

·>Обычно в приложении выделяется "главный" тред, который будет gc-free и обеспечивать чувствительную к задержкам логику. А другие треды могут обслуживать главный. Например, выделять память в вспомогательном треде и передавать её через volatile-переменную в главный.

Все еще проще. Уйти в reactive programming. Worker loops/Event loops будут разгребаться автоматически без пауз и без блокировок.
Тот же vertx или smallrye-mutiny
Re[10]: Java без сборки мусора
От: Infernal Россия  
Дата: 04.03.22 06:24
Оценка:
Здравствуйте, cppguard, Вы писали:

C>Здравствуйте, Infernal, Вы писали:


C>Можно, конечно, но зачем мне тогда Java?

Это ответили в параллельной ветке. Вся экосистема явы — это лучше чем придумывать костыли.

C>Квази это когда есть непредсказуемые паузы, но длятся они не больше заранее известного времени. Например, процесс управляет манипулятором, публикуя в шине CAN следующие опорные точки. Контроллер манипулятора требует, чтобы точки публиковались каждые 50мс. И если алгоритм тратит 1мс на работу, то 49мс у нас есть в запасе.


Если мы говорим про "манипулятор", то на сколько я понимаю бизнес логику — у вас изначально заведомо известны точки.
То есть мы загружаем шаблон, задаем данные, дальше отправляем на манипулятор. То есть если уж точно не хотите танцев с бубном, то вся бизнес логика по подготовке координат на java, дальше выгрузка куда то (не важно, текстовый файл, какой то MQ), дальше мини апликуха на сях, которая отправляет это все на CAN. В результате (как было сказано в параллельной ветке) будете бороться с линукс и железом. Они же тоже не realtime.
Re[12]: Java без сборки мусора
От: · Великобритания  
Дата: 04.03.22 09:27
Оценка: +1
Здравствуйте, Infernal, Вы писали:

I>·>Здравствуйте, cppguard, Вы писали:

I>·>Обычно в приложении выделяется "главный" тред, который будет gc-free и обеспечивать чувствительную к задержкам логику. А другие треды могут обслуживать главный. Например, выделять память в вспомогательном треде и передавать её через volatile-переменную в главный.
I>Все еще проще. Уйти в reactive programming. Worker loops/Event loops будут разгребаться автоматически без пауз и без блокировок.
I>Тот же vertx или smallrye-mutiny
Не очень ясно какое это имеет отношение к сабж.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.