Будет ли сборщик мусора Java останавливать мои потоки POSIX, созданные из вызовов JNI? - PullRequest
7 голосов
/ 15 апреля 2011

У меня есть критическое по времени приложение, которое должно отправлять UDP-дейтаграмму по заданному расписанию.Допуск на дрожание очень низок на приемной стороне.Реализация этого с помощью Java ScheduledThreadPoolExecutor не подходит, потому что, когда GC выполняет коллекцию «Остановить мир», мой поток приостанавливает работу, пока GC выполняет свою работу.

Я хотел бы реализовать бизнес-логику в Java при реализациикритические по времени части с потоками POSIX в C ++ (кстати, Native среда - это Linux).Это позволило бы нам сохранить тысячи строк кода, написанных на Java, а также получить необходимый нам темп от системных системных вызовов.

У меня такой вопрос: если я вызываю функцию JNI, которая создает отдельный поток POSIXбудет ли этот поток "приостановлен", когда Java GC делает коллекцию "Stop the World"?Есть ли какие-либо подводные камни, на которые опытный гуру JNI хотел бы указать, используя этот подход или какие-либо альтернативные подходы, которые можно было бы предложить?

Как всегда, благодаря потрясающему сообществу переполнения стека!

Ответы [ 2 ]

4 голосов
/ 15 апреля 2011

У меня такой вопрос: если я вызову функцию JNI, которая создает отдельный поток POSIX, будет ли этот поток "приостановлен", когда Java GC создает коллекцию "Остановить мир"?

Это не будет иметь никакого эффекта.STW влияет на потоки Java, которые должны прибыть в безопасную точку.Поток Java в нативный код также не будет затронут.

2 голосов
/ 15 апреля 2011

Он не должен блокировать поток posix (при условии, что gc не использует столько процессора, что другие системные вызовы будут заблокированы).Я думаю, что это заблокирует доступ к потоку posix из java-приложения, но только на очень ограниченное время.

...