Обновление с Java 1.4.2 до Java 6 (обе виртуальные машины Sun) приводит к снижению производительности - PullRequest
2 голосов
/ 12 декабря 2008

Я только что обновил некоторый старый исходный код Java, который работал на виртуальной машине Sun Java 1.4.2, до виртуальной машины Sun Java (JRE) 6. Более или менее единственное, что мне пришлось изменить, - это добавить явные типы данных для некоторых абстрактных объектов (Hashmap, Vector и так далее). Сам код достаточно интенсивно использует память, используя до 1 Гб динамической памяти (используя -Xmx1024m в качестве параметра для запуска ВМ).

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

  1. Может кто-нибудь придумать причину, почему производительность в моем случае сейчас хуже (просто в общем, конечно, поскольку вы не можете взглянуть на код)?
  2. Есть ли у кого-нибудь совет для не Java-гуру, что искать, если я хочу оптимизировать (по скорости) существующий код? Любые советы, рекомендуемые документы, инструменты?

Спасибо.

Ответы [ 4 ]

7 голосов
/ 12 декабря 2008

Не так много информации здесь. Но вот пара вещей, которые вы можете изучить:

  • Запустите виртуальную машину с одинаковыми значениями Xmx и Xms (в вашем случае 1024M)

  • Убедитесь, что сервер jvm dll используется для запуска виртуальной машины.

  • Запустите профилировщик, чтобы увидеть, какие объекты забирают память или какие объекты не собираются мусором

  • Подключите виртуальную машину с помощью jconsole и проследите через объекты

3 голосов
/ 12 декабря 2008

Теоретически может быть, что ваше приложение потребляет больше памяти, потому что произошли изменения в том, как Strings разделяют свой внутренний символ []. Меньше делится после 1.4. Проверьте мой старый блог на http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/5100 (новый блог здесь )

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

Если это не поможет, нам, профилировщику, например, Yourkit, найти различия.

3 голосов
/ 12 декабря 2008

Если вашему приложению почти не хватает свободного места, время сбора мусора может доминировать во времени вычислений.

Включите отладку gc, чтобы найти это. Или, что еще лучше, просто запустите jconsole и присоедините его к вашей программе.

0 голосов
/ 31 января 2010

Определенно используйте профилировщик в приложении (YourKit великолепен) ... легко потратить много времени на угадывание проблемы, когда большую часть времени вы сможете очень быстро сузить ее в профилировщике.

...