Я переношу пакетное приложение Spring 3.1.2 от jdk1.7.0_25
до jdk1.7.0_40
как x64, так и Oracle.
Используя Sun OperatingSystemMXBean.getProcessCpuTime()
в качестве показателя производительности, результаты показывают снижение производительности на 2,5 раза (т.е. мое приложение, работающее на u25, намного быстрее).
- Насколько я могу судить, это происходит не из-за изменений
java.util.HashMap
иjava.util.ArrayList
, так как результаты одинаковы, когда bootstrapping u40 с u25 классами HashMap и ArrayList, и эти изменения просто слишком малы для такого рода различий. - Это не связано с регрессией HashMap concurrency поскольку приложение однопоточное, а регрессия исправлена в u40..
- Оптимизация Hotswap также не является проблемой, так как работа с
-Xbatch
и-Xcomp
дает те же результаты (при условии, что компиляция сервера одинакова между этими JDK). - В < <27 > была производительность , но это кажется несвязанным. Если Spring 3.1.2 не использует их, что я не мог найти доказательств.
-
javac
компиляция также не изменяется.
Некоторые общие замечания:
- Эта проблема появляется для каждой версии JDK 7 >= u40 (а также
последней версии JDK 8jdk1.8.0
), тогда как версии < u40 выглядит просто отлично (включая различные версии JDK 6). - Обычный старый код Java (например, 1000 * 1000 * 1000 * some_calc) имеет не эту проблему производительности, что означает, что каким-то образом мой код или используемые библиотеки делают что-то странное и неожиданное?
- Тестирование проводилось с использованием одного и того же экземпляра базы данных (MSSQL 2008 R2), но это не важно.
- Даже если OperatingSystemMXBean ненадежна, время наступления тестов одинаково.
- В обоих случаях GC, похоже, запускается в одно и то же время и для тех же длительностей (я использовал
+UseSerialGC
для тестирования). - Профилирование не показывает никаких необычных новых горячих точек, хотя обычно оно показывает увеличение приложения во время выполнения приложения.
- Тестирование x86-версий этих версий Sun JDK или OpenJDK (я использовал эти) не меняет результат.
- Весь проверенный код (кроме случаев, когда он запущен на JDK 6) был скомпилирован с помощью
jdk1.7.0_40
. - Тот же сценарий был протестирован на двух разных компьютерах: x64 и x86.
Любые советы или идеи?
Отредактировано для добавления: Структура приложения представляет собой внешний цикл, который запускает моделирование финансового монта-карло: то есть множество дат, вычислений и т.д. Таким образом, в настоящее время он немного сложный и, я согласен, не идеален для поиска вопрос. Я должен попытаться уменьшить его.