2008-12-12 5 views
2

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

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

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

Спасибо.

+0

Я сомневаюсь, что это действительно влияет на что-либо, но с использованием вектора, когда вам не нужна его встроенная синхронизация/предотвращение потоков может быть чрезмерным –

+0

Вы пытались запустить исходный неподдающийся 1.4.2 скомпилированный код на Java 6? Вы можете выбрать конкретный сборщик мусора. Также возможно использовать -d32, чтобы убедиться, что вы не используете слишком много памяти для указателей. –

ответ

7

Здесь не много информации. Но вот несколько вещей, которые вы могли бы хотеть исследовать:

  • Запустите виртуальную машину с Xmx и XMS, как и то же значение (в вашем случае 1024M)

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

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

  • Подключите ваш ВМ с JConsole и проследить через объекты

+0

Неполадка сервера hotspot VM по умолчанию не задана на машинах Windows (даже машин класса «сервер»), поэтому это хороший совет. – Fortyrunner

3

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

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

3

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

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

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

0

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