Java .jar използва твърде много памет

Правя приложение в Java с помощта на Eclipse Indigo. Когато го стартирам с помощта на Eclipse, диспечерът на задачите показва, че javaw.exe използва 50mb памет. Когато експортирам приложението като изпълняващ се .jar и изпълня .jar, диспечерът на задачите показва, че javaw.exe използва 500mb. Защо е това? Как мога да поправя това?

Редактиране: Използвам Windows 7 64 бита и системата ми казва, че имам инсталирана 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 файл. AFAIK, не можете да задавате JVM параметри в JAR файл. Възможно е по някакъв начин да сте включили различна версия на нещо в JAR файла, но това е малко разтегливо ...

Ако никоя от тези идеи не помогне, опитайте профилиране.


Открит проблем. В един момент от цикъла while се създават нови екземпляри на BufferedImage, вместо да се замени същото BufferedImage.

А, да. BufferedImage използва големи количества памет извън купчината и това трябва да се управлява внимателно.

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

person Stephen C    schedule 08.04.2012