Ссылки на Java-программы, написанные только с использованием примитивов - PullRequest
11 голосов
/ 01 ноября 2010

Я слышал о Java-программах со строгими требованиями к задержке, где «новые» инструкции никогда-или очень редко используются (потому что нет новых => нет объектов-> нет GC => улучшенная задержка) ... вместо этого все бизнес логика обрабатывается с использованием примитивов.

Я не могу найти ссылки на эту технику в Интернете, хотя ... любая ссылка на веб-страницу, обсуждающую эту технику или фрагменты кода, будет высоко ценится.

Ответы [ 6 ]

14 голосов
/ 02 ноября 2010

Обновление (март 2012 г.): публичное объявление недоступно, но, похоже, Oracle закрыла свою группу JavaRTS.

Необходимо рассмотреть две темы: Спецификация в реальном времени для Java (JSR-1, JSR-282 ) и Критическая для безопасности спецификация для Java (JSR-302) , ( aonix page ). RTSJ предоставляет ресурсы для того типа тщательного управления памятью, о котором вы говорите в своем вопросе, хотя большинство пользователей RTSJ, вероятно, допускают больший джиттер, чем подход «все примитивы» (и, для этого допуска, они получают преимущества GC при использовании RTGC). Для некоторых примеров видов ограниченного распределения (ограничение, когда / где / сколько раз вы можете использовать new) ищите «правила памяти rtsj», и вот пример академической статьи по теме . Вам также следует взглянуть на "eventrons" как на пример попытки решить эти высокочастотные ограничения с низкой задержкой в ​​Java (относительно) чистым способом.

Подробнее о новой истории использования JavaRTS в торговых контекстах см. Здесь . Некоторые инструкции о том, как получить наиболее детерминированное поведение, в частности, из JavaRTS, см. Здесь .

Пользователи, критичные для безопасности, с большей вероятностью будут иметь такие ограничения, а SC-Java (как ожидается, будет частично) версией RTSJ с ограниченным доступом. Вы можете увидеть некоторые примеры того, на что смотрит экспертная группа, на слайдах статуса Дуга Локка 2007 года от JTRES .

.

Несколько человек выпускают JVM, предназначенные для использования в этой среде. Aonix / Atego's PERC ; aicas 'JamaicaVM ; Апогей Апелий . Sun / Oracle JavaRTS больше ориентирована на большие приложения, которые могут выдерживать (и извлекать выгоду) из менее строгих ограничений.

Хотя подход «все примитивы», который вы цитируете, является крайней формой этого типа программирования, вы, скорее всего, найдете ресурсы по этой теме в одной из приведенных выше ссылок.

Для "бизнес-логики в примитивах?" Скептики, обращающиеся ко мне, отмечают, что в IBM-ассемблере реализована значительная часть налоговой бизнес-логики IRS, и рассматривается ряд «корпоративных» уровней, таких как Java, чтобы обернуть (а не заменить!) эту логику. Положи это в свою трубку и покури.

Я не могу здесь привести какие-либо подробности, но есть ряд приложений защиты, использующих Java (обычно разновидность RTSJ), которые имеют очень жесткие ограничения на распределение памяти, и большая часть кода является статически распределенной, ориентированной на примитивы. , Обработка сигналов и т. Д. Я выполнил поиск материалов с открытым исходным кодом в известных мне системах, и эти документы (особенно разделы с ссылками) указывают на некоторые конкретные примеры этих приложений.

5 голосов
/ 02 ноября 2010

Я работал над рядом таких систем.Вам нужно будет беспокоиться о создании объектов, если вам нужны задержки менее миллисекунды.Можно написать приложение, которое не выполняет GC весь день, просто чтобы избежать задержек в GC.

Однако более 99% приложений не нуждаются в этом.

3 голосов
/ 01 ноября 2010

Ознакомьтесь со спецификацией Realtime для Java .

Хотя в нем есть более сложные правила, касающиеся w.r.t. распределение.

3 голосов
/ 01 ноября 2010

Нет, я никогда не слышал о таких программах или даже о технике.

Это кажется плохой идеей, потому что тогда вы фактически ограничены тем, что вы можете делать на C или подобных низкоуровневых языках. И если вы этого хотите, проще написать на C. Кроме того, есть много способов избежать длительных пауз GC, и на практике они могут удовлетворить большинство требований с низкой задержкой.

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

Так что я вполне уверен, что это городская легенда или, в лучшем случае, нишевая идея.

Изменить:

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

Как пример:

Многие среды реального времени Java накладывают некоторые ограничения на создание объектов. Это не означает, что они могут использовать только примитивы: использование сложных объектов все еще возможно, но, например, Критическая безопасность Java (http://www.aicas.com/papers/scj.pdf) требует, чтобы все экземпляры объектов происходили на этапе инициализации. После запуска приложения («фаза миссии») создание экземпляров больше не разрешается, поэтому вам придется работать с имеющимися экземплярами объектов.

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

Спасибо andersoj & mikera за объяснение этого мне.

2 голосов
/ 02 ноября 2010

Я использовал эту технику в программировании игр, где слишком много длительных задержек ГХ может ухудшить пользовательский опыт.На практике нет необходимости устранять все «новые» инструкции, просто держите их на разумном уровне.

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

2 голосов
/ 01 ноября 2010

* * * * могут быть некоторые торговые системы, которые делают это, но, насколько я понимаю (мои коллеги работают на торговых платформах с низкой задержкой на Java), хорошая быстрая современная JVM в сочетании с практикой разумного кодирования устраняет необходимостьперейти на «чистые примитивы» в коде.Тем не менее, я не разработчик с малыми задержками, наша команда промежуточного программного обеспечения беспокоится только о 1000 ткс в минуту, а не о 10 000 +.Не могу сказать, что нашел убедительную статью по этому поводу, хотя я рад, что был приятно удивлен :)

...