Ссылки на Java-программы, написанные только с использованием примитивов
Я слышал о Java-программах со строгими требованиями к задержке, где "новые" инструкции никогда - или очень редко - используются (потому что нет новых => нет объектов -> нет GC=> улучшенная задержка)... вместо этого обрабатывается вся бизнес-логика используя примитивы.
Я не могу найти ссылки на эту технику в Интернете, хотя... любая ссылка на веб-страницу, обсуждающую эту технику или фрагменты кода, будет высоко ценится.
6 ответов
Обновление (март 2012 г.): хотя публичного объявления нет, похоже, что Oracle закрыла свою группу JavaRTS.
Две темы, на которые вы должны обратить внимание, - это спецификация реального времени для Java (JSR-1, JSR-282) и критическая для безопасности спецификация для Java (JSR-302) ( страница aonix). RTSJ предоставляет ресурсы для того типа тщательного управления памятью, о котором вы говорите в своем вопросе, хотя большинство пользователей RTSJ, вероятно, переносят больший джиттер, чем подход "все примитивы" (и, для этого допуска, они получают преимущества GC при использовании RTGC). Для некоторых примеров видов ограниченного распределения (ограничение, когда / где / сколько раз вы можете использовать new
) поищите "rtsj scoped rules memory", и вот пример академической статьи по теме. Вам также следует взглянуть на "eventrons" как на пример попытки решить эти высокочастотные ограничения с низкой задержкой в Java (относительно) чисто.
Для конкретной новой истории об использовании JavaRTS в торговых контекстах, смотрите здесь. Некоторые инструкции о том, как получить наиболее детерминированное поведение, в частности, из JavaRTS, смотрите здесь.
Пользователи, критичные для безопасности, с большей вероятностью будут иметь такие ограничения, а SC-Java является (как ожидается, частично) версией RTSJ с ограниченным доступом. Вы можете увидеть некоторые примеры того, на что смотрит экспертная группа, на слайдах о статусе Дуга Локка 2007 года из JTRES.
Некоторые люди производят JVM, предназначенные для использования в этой среде. Aonix / Atego's PERC; aicas 'JamaicaVM; Апогей Апфелион. Sun/Oracle JavaRTS больше ориентирована на большие приложения, которые могут выдерживать (и извлекать выгоду) из менее жестких ограничений.
В то время как подход "все примитивы", который вы цитируете, является крайней формой этого типа программирования, вы, скорее всего, найдете ресурсы по этой теме в одной из приведенных выше ссылок.
За "бизнес-логику в примитивах?" Скептики, обращающиеся ко мне, отмечают, что в IBM-ассемблере реализована значительная часть налоговой бизнес-логики IRS, и рассматривается ряд "корпоративных" уровней, таких как Java, чтобы обернуть (а не заменить!) эту логику. Положи это в свою трубку и покури.
Я не могу здесь привести какие-либо подробности, но есть ряд приложений защиты, использующих Java (обычно разновидность RTSJ), которые имеют очень жесткие ограничения на распределение памяти, и большая часть кода является статически распределенной, сфокусированной на примитивах. Обработка сигналов и т. Д. Я выполнил поиск материалов с открытым исходным кодом в известных мне системах, и эти документы (особенно разделы с ссылками) указывают на некоторые конкретные примеры этих приложений.
- http://www.aicas.com/papers/scj.pdf
- http://www.cs.purdue.edu/homes/jv/pubs/safecert09.pdf
- AN / FPS-85 SpaceTrack Radar: http://unix.org.in/2010/10/sun-java-real-time-system-selected-for-space-surveillance-radar-java-technology-enables-real-time-behavior-and-throughputaviation/ и http://www.globalsecurity.org/space/systems/an-fps-85.htm
- Армия FCS: http://www.militaryaerospace.com/index/display/article-display/234337/articles/military-aerospace-electronics/volume-16/issue-8/news/aonix-hard-real-time-java-technology-useful-for-command-and-control.html обмен на командно-control.html
Я работал над рядом таких систем. Вам нужно будет беспокоиться о создании объектов, если вам нужны задержки менее миллисекунды. Можно написать приложение, которое не выполняет GC весь день, просто чтобы избежать задержек в GC.
Однако более 99% приложений не нуждаются в этом.
Ознакомьтесь со спецификацией в реальном времени для Java.
Хотя у него довольно сложные правила в отношении распределения.
Нет, я никогда не слышал о таких программах или даже о технике.
Это кажется плохой идеей, потому что тогда вы фактически ограничены тем, что вы можете делать на C или подобных низкоуровневых языках. И если вы этого хотите, проще написать на C. Кроме того, есть много способов избежать длительных пауз в GC, и на практике они могут удовлетворить большинство требований с низкой задержкой.
Кроме того, для того, чтобы сделать что-нибудь полезное, вам придется использовать API-интерфейсы платформы Java или другие сторонние библиотеки, которые, вероятно, будут размещать множество объектов за вашей спиной, поэтому избегание всех экземпляров объектов, вероятно, даже не практично в Тривиальная программа.
Так что я совершенно уверен, что это городская легенда или, в лучшем случае, нишевая идея.
Редактировать:
Этот метод используется для получения поведения в режиме реального времени или с низкой задержкой. В настоящее время это может быть устаревшим из-за лучших алгоритмов GC, но это, конечно, будет зависеть от обстоятельств. Так что это, вероятно, что-то рассмотреть, по крайней мере, для горячих точек алгоритма.
В качестве примера:
Многие среды реального времени Java накладывают некоторые ограничения на создание объектов. Это не означает, что они могут использовать только примитивы: использование сложных объектов все еще возможно, но, например, Java для критической безопасности ( http://www.aicas.com/papers/scj.pdf) требует, чтобы все экземпляры объектов происходили во время фаза инициализации. После запуска приложения ("фаза миссии") создание экземпляров больше не разрешается, поэтому вам придется работать с имеющимися экземплярами объектов.
Это позволяет избежать непредсказуемости, связанной с динамическим размещением и сборкой мусора, но все же позволяет использовать динамическую память (ограниченным образом).
Спасибо andersoj & mikera за объяснение этого мне.
Могут быть некоторые торговые системы, которые делают это, но, насколько я понимаю (мои коллеги работают на торговых платформах с низкой задержкой на основе Java), хорошая быстрая современная JVM в сочетании с практикой разумного кодирования избавляет от необходимости использовать в коде "чистые примитивы". Тем не менее, я не разработчик с малыми задержками, наша команда промежуточного программного обеспечения беспокоится только о 1000 ткс в минуту, а не о 10 000 +. Не могу сказать, что нашел убедительную статью по этому поводу, хотя я счастлив быть приятно удивленным:)
Я использовал эту технику в игровом программировании, где слишком много длительных задержек GC могут ухудшить пользовательский опыт. На практике нет необходимости удалять все "новые" инструкции, просто держите их на разумном уровне.
Хорошим примером библиотеки, которая использует многие из этих методов, является Javolution. Стоит посмотреть, если вы либо интересуетесь тем, как она кодируется, либо хотите использовать готовые структуры данных и алгоритмы, которые поддерживают работу с минимальным распределением.