У меня есть Java-программа, которая работает на (большом) графике. Таким образом, он использует значительное количество пространства кучи (~ 50 ГБ, что составляет около 25% от физической памяти на главной машине). В какой-то момент программа (неоднократно) выбирает один узел из графика и выполняет некоторые вычисления с ним. Для некоторых узлов это вычисление занимает гораздо больше времени, чем ожидалось (30-60 минут, а не ожидаемые несколько секунд). Чтобы профилировать эти операции, чтобы узнать, что занимает так много времени, я создал тестовую программу, которая создает только очень небольшую часть большого графа, а затем выполняет ту же операцию на одном из узлов, которые занимали очень много времени, чтобы вычислить в оригинальная программа. Таким образом, в тестовой программе, очевидно, используется очень мало кучи, по сравнению с исходной программой.Java медленнее с большой кучей
Оказалось, что операция, которая заработала 48 минут в исходной программе, может быть выполнена за 9 секунд в тестовой программе. Это меня действительно смущает. Первая мысль может заключаться в том, что большая программа тратит много времени на сборку мусора. Поэтому я включил подробный режим сборщика мусора VM. Согласно этому, полные сборки мусора не выполняются в течение 48 минут, и только около 20 коллекций в молодом поколении, каждый из которых занимает менее 1 секунды.
Так что мои вопросы - что еще может быть, что объясняет такую огромную разницу во времени? Я не знаю много о том, как Java внутренне организует кучу. Есть ли что-то, что занимает значительно больше времени для большой кучи с большим количеством живых объектов? Может ли быть, что выделение объектов занимает гораздо больше времени в такой настройке, потому что для нахождения подходящего места в куче требуется больше времени? Или VM делает внутреннюю реорганизацию кучи, которая может занять много времени (помимо сбора мусора, очевидно).
Я использую Oracle JDK 1.7, если это имеет значение.
Не зная, какие операции выполняет ваша программа, на это невозможно ответить. –
Как иначе тест и основная программа отличаются от количества выделяемой кучи? Работают ли они на других типах данных? Сколько кучи использует тестовое приложение, есть опция производительности для использования коротких указателей, если используется только небольшая куча (но это никоим образом не может объяснить вашу разницу в производительности) – ooxi
Вы должны использовать хороший профилировщик (например, YourKit) для проанализируйте причину медленности, мне трудно поверить, что кто-то здесь может догадаться, каковы источники проблемы. – alfasin