Java-приложение ломает 10% времени - PullRequest
1 голос
/ 02 мая 2011

У меня есть приложение, использующее буферизованное изображение размером 2400x1800 (которое, как я знаю, требует много ресурсов), но оно прекрасно работает более 90% времени.Занимает 130 МБ ОЗУ и использует 5% ЦП.

Проблема в том, что в 10% случаев он имеет большое отставание и потребляет только 40–50 МБ ОЗУ и использует 50% ЦП.Почему он не съел ту же самую память?

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

Ответы [ 5 ]

0 голосов
/ 02 мая 2011

Возможно, вам могут помочь такие параметры JVM, как Xmx (это максимальный размер, доступный для использования приложением) и Xss (это начальная память для этого приложения).

попробуйте это в своем затмении(при условии, что вы используете его)

перейдите в меню RUN ,

затем Запустите конфигурации ...

и выберите свойRunner.

и нажмите на вкладку (x) = Аргументы .

добавьте это к своим аргументам виртуальной машины

-Xmx512m -Xss150m

Попробуйте запустить его ... это заставит вашу JVM запуститься как минимум с 150 МБ свободной оперативной памяти, уже выделенной для него ...

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

0 голосов
/ 02 мая 2011

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

Вот руководство к

0 голосов
/ 02 мая 2011

Вы загружаете картинку одним снимком? Почему бы не сделать это и создать несколько потоков, которые загружают изображение? Если часть вашей программы, которая загружает View, настолько велика, почему бы просто не распределить ее по потокам? Нужен еще совет?

Удачи

0 голосов
/ 02 мая 2011

Во-первых, 130 МБ это много, даже для изображения 2400x1800, это означает, что вы потребляете 27 Байт на пиксель.

Для классического изображения 32 бит на пиксель (или 4 байта) вам потребуется всего 16-17 МБ

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

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

Редактировать: может быть, вы создаете много новых изображений этого размера вместо того, чтобы обновлять их, форсируя выделение большого количества памяти и ее удаление?

0 голосов
/ 02 мая 2011

Запустите его через профилировщик.JProfiler - хороший вариант для использования.

...