4

Насколько хорошо оптимизирован параллельный сбор GC для параллельных вычислений Java для многопоточных сред? Я написал многопоточный Jython-код, который большую часть времени тратит на вызовы библиотек Java. В зависимости от того, с какими параметрами я запускаю программу, библиотека вызывает либо тонны распределений под капотом, либо практически нет. Когда я использую параметры, которые требуют тонны распределений кучи, я не могу получить код для масштабирования за последние 6 ядер. Когда я использую параметры, которые не требуют большого количества распределений, он масштабируется как минимум до 20. Насколько вероятно, что это связано с узким местом GC, учитывая, что я использую запас Sun VM, параллельный GC и Jython как мой язык клей?Java GC Threading Bottleneck на практике?

Редактировать: Чтобы уточнить, я не обязательно буду думать о вещах, которые очевидны для ветеранов Java, потому что я почти никогда не использую языки Java/JVM. Я выполняю большинство своих программ в D и флагманскую реализацию CPython Python. Я использую JVM и Jython для небольшого одноразового проекта b/c Мне нужен доступ к библиотеке Java.

+1

Какие у вас варианты? Это похоже на проблему ThreadPool, а не на проблему с GC. –

+0

@Thierry: параметры специфичны для моей программы, с точки зрения вызова функций библиотеки. Я даже не использую ThreadPool. – dsimcha

ответ

2

Для меня проблемы с GC и многопоточность очень реальны. Я не говорю, что JVM плоха, дело в том, что самой проблеме очень сложно справиться.

В одном из наших проектов у нас было два приложения, запущенных в одном JVM (приложении). Когда они подчеркивали их индивидуально, это было прекрасно, но когда оба были напряженными, производительность ухудшалась странным образом. Наконец, мы разделили приложения. в двух JVM, и производительность вернулась к нормальной (конечно, медленнее, чем когда использовалось только одно приложение, но разумно).

Тюнинг GC чрезвычайно прост. Вещи могут улучшиться в течение 5 минут, а затем основная коллекция будет блокироваться и т. Д. Вы можете решить, хотите ли вы высокой пропускной способности или низкой латентности в операциях. Высокая пропускная способность подходит для пакетной обработки, для интерактивного применения требуется низкая латентность. В конечном счете, параметры по умолчанию для JVM были для нас лучшими результатами!

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

+0

Я знаю, что проблемы GC/многопоточности существуют, но GC GC GC очень утончен и настолько выгоден из-за строгости Java как языка (без союзов, необработанных указателей и т. Д.), Что я думал, что это в основном решены проблемы. В D проблемы еще больше, но поскольку я обычно пишу больше кода «с нуля», а не кода клейма, в D и могу делать больше грязных трюков, чтобы избежать ненужных распределений, их также легче обойти. Думаю, что работа вокруг них в текущем проекте будет означать переписывание большой библиотеки. – dsimcha

3

Поскольку ваш вопрос касается узких мест GC, вы можете устранить эту возможность, включив ведение журнала GC и проверку журналов - если имеется большое количество событий GC с большими паузами, вы можете подтвердить/убрать эту теорию. (Однако в описываемом вами сценарии я бы предположил, что это не проблема GC).

+0

Спасибо, я понятия не имел, что получить доступ к легко читаемому журналу того, что делает GC, было так просто, пока вы не указали мне на него, и я пошел в него. Это определенно не так просто в D и AFAIK не так просто в CPython. Журналы определенно проясняют одно: GC работает несколько раз за ** секунду **. Я изумляюсь, как и в шкалах кода. – dsimcha

1

Java GC является поколением. Коллекция первого поколения предназначена для ухода за недолговечными объектами и, как ожидается, будет работать часто. Ожидаемое поведение за короткий промежуток времени несколько раз в секунду, если имеется много короткоживущих ассигнований. (Это должен быть комментарий, а не ответ - у меня нет репутации, извините).

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

Некоторые (старые) Информация здесь: http://java.sun.com/developer/technicalArticles/Programming/turbo/#The_new_GC

0

Производительность Threading может варьироваться от одной версии jdk до другой. По моему опыту, на jdk6u18 параллельный gc, включенный с помощью -XX: + UseParallelGC (, но не), очень хорошо работает на четырехъядерном ядре с сотнями очень активных потоков. Я считаю маловероятным, чтобы он не масштабировался более чем на 6 ядер.

Тот факт, что оборудование Sun основано на процессорах с большим количеством ядер, объясняет, почему они приложили много усилий в новых сборщиков мусора в последние годы.

Параллельный gc не включен по умолчанию, поскольку его однопоточная производительность не так хороша, как по умолчанию gc.

Смежные вопросы