2008-11-26 4 views
4

Я работаю с Java-приложением, запускаемым через командную строку. Он обрабатывает файлы XML, особенно базу данных dblp.xml, которая имеет более 400 МБ.Обновление с Java VM 5-6 позволило значительно увеличить потребление памяти

Я использовал JVM 5, и моему приложению понадобилось 600-700 МБ памяти для обработки dblp.xml. После обновления до JVM 6 его запуск требует более 1 гб памяти (чего-то у меня нет), хотя он работает немного быстрее.

Я почти уверен в разнице в потреблении памяти, потому что я уже тестировал их снова и снова на этом же компьютере. Результатом является то же различие в потреблении памяти.

Я не установил никаких специальных параметров, просто -Xmx800M или -Xmx1000M. Бег с Ubuntu Hardy Heron на двухъядерном 1,7 ГГц, с 1,5gb памяти Используя только верхний/пс команды для измерения

Любой из иметь представление о том, почему это происходит? Я действительно хотел использовать JVM 6, потому что на моем производственном сервере используется JVM, и я не могу легко меняться.

Благодаря

+0

Как вы измеряете потребление памяти и в какой операционной системе вы работаете? – 2008-11-26 01:44:33

+0

Ubuntu Hardy Heron Я использую только команды top/ps, но разница слишком велика. С Java 5 приложение завершает обработку с Java 6 он не Спасибо за ответ – 2008-11-26 03:45:34

+0

Больше информации: Я бегу это на двухъядерном 1,7 ГГц, с 1,5gb памяти – 2008-11-26 03:50:48

ответ

4

Мой совет должен был бы использовать инструмент, как JProfiler, чтобы попытаться получить ручку на точно, где ваше потребление памяти увеличилось. Если вы не можете потратить на JProfiler, ознакомьтесь с этим списком open source java profiling tools.

Угадайте причину проблем с производительностью - это плохая идея, потому что вы почти всегда ошибаетесь в своей догадке, и вы тратите время на оптимизацию неправильной части системы. После того, как у вас есть объективные данные, вы сможете придумать оптимизацию, уменьшающую потребление памяти.

Если это правда, что новый JVM торгует памятью для скорости (путем кэширования), тогда существует вероятность, что вы можете использовать jvm arg, чтобы остановить это поведение. Лучше всего проверить выпускные заметки для Java 6 и посмотреть, упоминается ли такая функция.

0

звучит как новый JVM, торгующий пространством памяти для скорости (т. Е. Кэширования, а что нет)?

3

Возможно, вы использовали 32-битную 1.5 JVM и 64-битную 1,6 JVM? Вы можете узнать, является ли это 32-битный или 64-битной JVM с

java -version 

64-битная JVM нужно примерно 30% больше памяти по сравнению с 32 битной виртуальной машины Java, так как вам нужно 8 байт для каждой ссылки, а не 4 байта ,

0

Ничто в команде «java -version» не говорит мне, что это 64-разрядная версия (или 32-разрядная версия), есть ли более конкретный способ проверить, является ли ее 64-разрядная версия (хотя я думаю, что это не так). Но я получил это как от «apt-get».

Я просто попробовал запустить приложение с аргументом -d32 (чтобы заставить 32 бита, модель данных), похоже, что он использует немного меньше памяти, но он по-прежнему использует еще больше, чем с jvm 5

JVM 6:

/USR/Библиотека/JVM/Java-6-ВС/JRE/бен/Java -версия Java версии "1.6.0_07" Java (TM) SE Runtime Environment (сборка 1.6. 0_07-b06) Клиентская виртуальная машина Java HotSpot (TM) (сборка 10.0-b23, смешанный режим, обмен)

(на моей машине сервера) Java -версия Java версия "1.6.0" Java (TM) SE Runtime Environment (сборка 1.6.0-B105) Java HotSpot (TM) Client VM (сборка 1.6.0-B105, смешанный режим)

JVM 5:

Java -версия Java версии "1.5.0_16" Java (TM) 2 Runtime Environment, Standard Edition (build 1.5.0_16-b02) Клиентская виртуальная машина Java HotSpot (TM) (сборка 1.5.0_16-b02, смешанный режим, совместное использование)

Спасибо за anwsers

+0

, если есть нет строки типа «Java-HotSpot (TM) 64-Bit Server VM» в выводе «java -version», у вас есть 32-битные JVM. Измените этот ответ и добавьте вывод обоих вызовов «java -version». – 2008-11-26 16:06:14

+0

Спасибо за редактирование. Насколько мне известно, вы используете 32-битные JVM. Возможно, вам захочется сравнить размеры генерации GC с jconsole. Может быть, вы получите ключ. Я использую как 1.5, так и 1.6 экстенсивно и не могу подтвердить свои наблюдения приложениями с интенсивной памятью. – 2008-11-26 19:42:56

1

Использование только верх/пс команды для измерения

Вы не можете измерить потребление памяти для виртуальной машины Java с top или ps.

JVM резервирует память довольно жадно. Иногда он делает это, даже не пытаясь освободить уже зарезервированную память GCing. (Вы могли бы попытаться указать -Xms параметр, чтобы изменить это. Читайте this узнать (много) больше.)

top и ps только показывают количество в настоящее время зарезервированной памяти, а не памяти на самом деле используется в вашей Java приложения!

Если вы хотите правильно измерить использованную память, вам необходимо измерить ее из самой Java. Грубой силы подход будет:

System.gc(); 
Runtime runtime = Runtime.getRuntime(); 
long memUsedInBytes = runtime.totalMemory() - runtime.freeMemory(); 

(! Пожалуйста, только для отладки и никогда в производстве код System.gc() зло.)

Но я предполагаю, что вы столкнетесь с OutOfMemoryErrors -Xmx800M и 1,6, в то время как 1,5 работает отлично. Если это так, этот ответ является лишь побочным эффектом, потому что тогда у вас есть разница в потреблении памяти.

0

Что вы используете для анализа XML-файла? Существовал ошибка в исходной библиотеке Java 6, что приведет к такому поведению:

Bug 6536111

Существует обходной путь в комментариях.

0

Какой JDK вы используете? Я бы порекомендовал вам попробовать JDK Sun (версия сервера), поскольку JRE (клиентская версия) не так эффективна в памяти.

0

вы можете проверить с помощью Jconsole

x86 32 бит. Если вы действительно хотите знать, где используется память, получите Eclipse Memory Analyzer

0

Возможно, ваша предыдущая виртуальная машина запускала клиентский движок (т.е. «java -client»), в то время как текущий использует механизм сервера («java-server»)), который использует больше памяти, чтобы иметь гораздо более высокие скорости. Вы можете увидеть это в выводе «java -version». Используемый по умолчанию двигатель можно установить в jvm.cfg (см. http://forums.sun.com/thread.jspa?threadID=5185368&tstart=1314 для получения более подробной информации об этом).