Ссылки на java-программы, закодированные с использованием только примитивов

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

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

Ответы

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

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

Однако 99% + приложений не нуждаются в этой чрезвычайной ситуации.

Ответ 3

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

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

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

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

Edit:

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

В качестве примера:

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

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

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

Ответ 5

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

Ответ 6

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

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