Обновление с Java 1.4.2 до Java 6 (обе виртуальные машины Sun) приводит к снижению производительности

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

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

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

Спасибо.

12.12.2008 11:24:27
Я сомневаюсь, что это действительно влияет на что-либо, но использование Vector, когда вам не нужно, его встроенная синхронизация / защита потоков может быть излишним
matt b 12.12.2008 14:23:31
Вы пытались запустить оригинальный некомпилированный код 1.4.2 на Java 6? Вы можете выбрать определенный сборщик мусора. Также возможно используйте -d32, чтобы убедиться, что вы не используете слишком много памяти для указателей.
Tom Hawtin - tackline 14.12.2008 16:38:00
4 ОТВЕТА
РЕШЕНИЕ

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

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

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

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

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

7
12.12.2008 11:35:30
Виртуальная точка доступа сервера не выбирается по умолчанию на машинах Windows (даже на машинах класса «сервер»), так что это хороший совет.
Fortyrunner 21.12.2008 23:41:41

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

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

3
12.12.2008 11:53:50

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

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

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

3
12.12.2008 15:07:46

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

0
31.01.2010 02:25:59