Я задал этот вопрос несколько недель назад, но у меня все еще есть проблема, и у меня есть некоторые новые подсказки. Оригинальный вопрос здесь:
Случайные замедления Java в Mac OS
По сути, у меня есть Java-приложение, которое разбивает работу на независимые части и запускает их в отдельных потоках. Потоки не имеют синхронизации или элементов общей памяти. Единственными ресурсами, которыми они делятся, являются файлы данных на жестком диске, причем каждый поток имеет открытый файловый канал.
Большую часть времени он работает очень быстро, но иногда он работает очень медленно без видимой причины. Если я подключу к нему профилировщик процессора, он снова начнет работать быстро. Если я сделаю снимок процессора, он скажет, что большую часть своего времени он проводит в «самостоятельном времени» в функции, которая ничего не делает, кроме проверки нескольких (неразделенных несинхронизированных) логических значений. Я не знаю, как это может быть точным, потому что 1, это не имеет смысла, и 2, добавление профилировщика, кажется, выбивает потоки из любого режима, в котором они находятся, и решает проблему. Кроме того, независимо от того, работает ли он быстро или медленно, он всегда завершает работу и выдает один и тот же вывод, и при этом он никогда не падает в общем использовании ЦП (в данном случае ~ 1500%), подразумевая, что потоки не блокируются.
Я пробовал разные сборщики мусора, разные размеры частей пространства памяти, запись выходных данных на диски без raid и размещение всех выводимых данных в потоках, разделяющих основные рабочие потоки.
Кто-нибудь знает, что это за проблема? Это может быть операционная система (OS X 10.6.2)? Я не смог продублировать его на машине с Windows, но у меня нет такой с аппаратной конфигурацией.