Java .jar использует слишком много памяти

Я делаю приложение на Java, используя Eclipse Indigo. Когда я запускаю его с помощью Eclipse, диспетчер задач показывает, что javaw.exe использует 50 МБ памяти. Когда я экспортирую приложение как исполняемый .jar и запускаю .jar, диспетчер задач показывает, что javaw.exe использует 500 МБ. Почему это? Как я могу это исправить?

Изменить: я использую 64-разрядную версию Windows 7, и моя система говорит, что у меня установлена ​​Java 1.7. По-видимому, проблема с памятью вызвана циклом while. Я изучу, что внутри цикла while вызывает проблему.

Изменить: проблема найдена. В какой-то момент цикла while создаются новые экземпляры BufferedImage вместо замены тех же экземпляров BufferedImage.


person user1319734    schedule 08.04.2012    source источник
comment
Вы уверены, что не путаете экземпляр Eclipse с экземпляром приложения? Eclipse — это тоже java-приложение — просто предположение. Кроме этого, вы можете попробовать использовать профилировщик, чтобы выяснить, что происходит.   -  person jefflunt    schedule 08.04.2012


Ответы (3)


Без каких-либо дополнительных сведений о вашем коде я бы предложил использовать профилировщик для анализа проблемы. Я знаю, что YourKit и тот, который доступен для NetBeans, очень хороши.

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

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

Это должно быть хорошей отправной точкой, но, пожалуйста, сообщите о своих результатах, чтобы мы знали, как все идет. Кстати, какая у вас операционная система и какая версия java?

--Луис

person lantunes    schedule 08.04.2012

Вам нужно профилировать свой код, чтобы получить точный ответ, но по моему опыту, когда я вижу подобные вещи, я часто приравниваю их к сборке мусора. Например, я выполнил одно и то же задание и дал одному заданию 10 гигабайт, а другому 2 гига. Оба запускались и выполнялись, но 10-гигабайтное задание использовало больше памяти (и заканчивалось быстрее), а второе (2-гигабайтное), я думаю, собирал мусор поэтому он все еще завершен, но занял немного больше времени с меньшим объемом памяти. Я немного новичок в java, поэтому, возможно, я предполагаю сбор мусора, но я видел, о чем вы говорите.

Вам нужно профилировать свой код (проверьте jconsole, который включен в java, или visualVM).

person Lostsoul    schedule 08.04.2012

Это звучит весьма необычно.

Я могу придумать два возможных объяснения:

  • Вы посмотрели не на тот экземпляр javaw.exe. Возможно, вы смотрели на экземпляр, на котором работает Eclipse... который, вероятно, будет таким же или даже больше.

  • Вам (каким-то образом) удалось настроить Java для работы с большой кучей по умолчанию. В Linux вы можете сделать это с помощью скрипта-оболочки, функции оболочки или псевдонима оболочки. Вы можете сделать хотя бы первый из них в Windows.

Я не думаю, что это сам файл JAR. Насколько я знаю, вы не можете установить параметры JVM в файле JAR. Возможно, вы каким-то образом включили другую версию чего-либо в файл JAR, но это немного натянуто...

Если ни одна из этих идей не помогает, попробуйте профилирование.


Проблема найдена. В какой-то момент цикла while создаются новые экземпляры BufferedImage вместо замены одного и того же BufferedImage.

О да. BufferedImage использует большие объемы памяти вне кучи, и ею необходимо тщательно управлять.

Но это не объясняет, почему ваше приложение использовало больше памяти при запуске из JAR, чем при запуске из Eclipse... если вы не говорили приложению делать разные вещи.

person Stephen C    schedule 08.04.2012