Ще спре ли Java Garbage Collector моите POSIX нишки, създадени от JNI повиквания?

Имам критично време приложение, което трябва да изпрати UDP дейтаграма по зададен график. Толерантността към трептене е много ниска от приемащата страна. Прилагането на това с java ScheduledThreadPoolExecutor не е адекватно, защото когато GC прави колекция „Stop the World“, моята нишка спира, докато GC върши своята работа.

Бих искал да внедря бизнес логиката в Java, докато внедрявам критичните за времето части с POSIX нишки в C++ (родната среда е Linux между другото). Това би ни позволило да спестим хиляди редове код, написан на Java, и също така да получим необходимия темп от естествените системни извиквания.

Въпросът ми е следният: Ако извикам JNI функция, която създава отделна POSIX нишка, тази нишка ще бъде ли "поставена на пауза", когато Java GC направи колекция "Stop the World"? Има ли някакви капани, които опитен JNI гуру би искал да посочи с този подход или някакви алтернативни подходи, които би предложил?

Както винаги, благодарение на страхотната общност за препълване на стека!


person LPalmer    schedule 15.04.2011    source източник
comment
Какво ще кажете да използвате по-добър GC, като HotSpot G1 GC?   -  person Matt Ball    schedule 15.04.2011
comment
моята нишка спира, докато GC върши работата си. това предположение или заключение от измерване ли е? Отговори на въпроса stackoverflow.com/questions/2085544/ твърдят, че периодът на спиране на света е кратък за съвременните GC.   -  person Raedwald    schedule 15.04.2011
comment
Този GC използва паралелност, за да получи повечето от своите печалби в производителността. За съжаление, процесорът, на който работи това, е едноядрен Celeron. Не мисля, че ще спечелим нещо от G1 GC, освен ако не обновим нашия процесор и тъй като това е високотемпературно устройство в стил SBC, засега сме останали с нашия малък Celeron.   -  person LPalmer    schedule 15.04.2011
comment
Ако сте толкова чувствителни към трептене, че обмисляте внедряването на секцията за синхронизиране нативно, тогава всяка stw пауза не е добра. В този момент обаче трябва да имате предвид трептенето на операционната система, например в резултат на прекъсвания.   -  person Matt    schedule 15.04.2011
comment
Моят чувствителен към трептене момент е в диапазона от 5 до 10 ms. GC може да прекъсне цял процес за до 300 ms. Това е твърде дълго. Операционната система няма да заключи програмата ми за 300 ms.   -  person LPalmer    schedule 15.04.2011
comment
В зависимост от поведението на разпределението, размера на купчината и наличната памет, бих казал, че имате известен шанс да получите паузи от 5-10 ms. Не може да се гарантира, разбира се.   -  person Matt    schedule 15.04.2011
comment
@Raedwald Периодът на спиране на света е измерен на 150ms до 300ms. Що се отнася до модерния GC, аз използвам най-новия java 1.6 GC, настроен да бъде едновременна маркировка и с няколко други флага, които решихме, че са най-добри за нашето приложение.   -  person LPalmer    schedule 16.04.2011
comment
@Matt разпределението е лепкав проблем. Не забравяйте, че не съм единственият, който разпределя обекти в паметта. Обектите също се разпределят от различните части на Java API, така че не мога НАПЪЛНО да контролирам колко обекти се създават.   -  person LPalmer    schedule 16.04.2011
comment
@Matt, моят опит с G1 - изтича памет.   -  person bestsss    schedule 16.04.2011
comment
@bestsss, настройката на IME G1 не е добре документирана и открих, че CMS го превъзхожда при измерване с времена STW (и интересното изглежда, че ParNew прави приложението значително по-бързо, отколкото работи под G1). Настроих приложение, чувствително към латентност, така че 98-99% от паузите да са в рамките на 5-10 милисекунди, разчитайки, че работи само 24 часа в денонощието, 6 дни в седмицата и все пак мога да избегна пълен gc през тези 6 дни.   -  person Matt    schedule 16.04.2011


Отговори (2)


Не трябва да блокира posix нишката (ако приемем, че gc не използва толкова много процесор, че други системни извиквания да бъдат блокирани). Мисля, че ще блокира достъпа до posix нишката от приложението Java, но само за много ограничено време.

person joekarl    schedule 15.04.2011

Въпросът ми е следният: Ако извикам JNI функция, която създава отделна POSIX нишка, тази нишка ще бъде ли "поставена на пауза", когато Java GC направи колекция "Stop the World"?

Няма да има ефект. STW засяга Java нишки, които трябва да стигнат до безопасна точка. Нишка на Java в собствен код също няма да бъде засегната.

person bestsss    schedule 15.04.2011