|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
23.10.2017, 20:25 | #1 |
Пользователь
Регистрация: 02.12.2012
Сообщений: 12
|
Переполнение памяти под JVM
Доброго времени суток! Я начинающий программист JAVA. Пишу уже лет семь под "С" для микроконтроллеров. Но есть необходимость писать прикладные программы для компьютера и android устройств. Осваиваю вывод растровой графики в JAVA. Скопировал программу и видоизменил под себя.
Код:
Изучаю готовый код подставляя какие нибудь значения или изменяя, дополняя какие нибудь строки. Так как комментарии к кодам очень скудные. А книги не все читабельны, чтобы было понятно. Код работает но тормозит на 5-6 секунде. Понятно что память отведённая под JVM перегружается. Но начинающему трудно определить вообще где кроится ошибка. Только не отсылайте на те или иные сайты, а лучше помогите с этим кодом и желательно прокомментируйте для чего какие строки нужны. Буду очень благодарен. Спасибо заранее. |
23.10.2017, 21:06 | #2 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
А зачем цикл в main?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
23.10.2017, 21:21 | #3 |
Пользователь
Регистрация: 02.12.2012
Сообщений: 12
|
Я только учусь и поэтому не знаю как правильно выводить по очереди две картинки в бесконечном цикле.
|
23.10.2017, 21:24 | #4 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
По очереди это как? Что сделать-то надо?
Вы ж тут просто создаете бесконечное число картинок (причем так быстро, что человек вряд ли заметит), а память не бесконечная.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
23.10.2017, 21:36 | #5 |
Пользователь
Регистрация: 02.12.2012
Сообщений: 12
|
Две картинки заменяют друг друга в бесконечном цикле. У меня на диске они именуются K26 и K25.
|
23.10.2017, 21:40 | #6 |
Пользователь
Регистрация: 02.12.2012
Сообщений: 12
|
и как создаются временный задержки в JAVA нигде толком не описаны. А вообще картинки должны заменять друг друга с периодом в пол секунды. Это на железнодорожный светофор на переезде.
|
23.10.2017, 23:07 | #7 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
Вообще в гуях делать циклы нельзя. Они заглушат обработку сообщений от системы (таймеры, мышка и т.д. и т.п.) и в итоге прогу прибьют ("не отвечает" - это и есть цикл). Это в любых языках и на всех ОС. Т.о. действия в контексте потока гуя должны быть максимально коротки (типа как обработчик прерываний).
Нужно делать или переодический таймер, который будет раз в 500мс тикать в контексте потока-создателя (гуй) и вызывать (планировать на чуть позже по факту) перерисовку с новой картинкой, или поток (но, из потока нельзя вызывать методы гуя напрямую, типа "перерисуйся", зато это истинная параллельность). В отдельных потоках (Thread) можно вытворять че угодно - циклы, задержки, но нельзя вызвать гуй на прямую. Там есть спец. вещи, типа Platform.runLater в javafx, который запланирует действие в контексте гуя, на когда-то позже, когда ОС позволит. И бросайте это старье свинг/авк. Есть же уже javafx. Upd: вообще во всех GUI-OS существует концепция цикла сообщений. Т.о. программа стартует и запускает бесконечный цикл, который взаимодействует с ОС (в Java это скрыто в компонентах). В этом цикле программа читает из ОС сообщения (мышь, клавиатура, перерисовка) и вызывает ваши функции для выполнения действий. Например, paint вызовется, когда ОС посчитает нужным (например, перекрытие окон, или вы можете вручную запрашивать ОС перерисовать (update), но это снова ничего не гарантирует по срокам). Т.о. ваши функции не должны занимать слишком много времени, иначе они блокируют работу цикла сообщений. Все тяжелые вычисления выносятся в Thread. Или фрагментируются на куски/шаги, выполняемые переодически, например по таймеру (так было в Win 3.11 последний раз). Насчет названия темы - вы в цикле создаете новые копии картинок, и этот цикл заблокировал все остальное, т.о. память потребляется быстрее, чем реагирует gc. Последний раз редактировалось alexzk; 23.10.2017 в 23:21. |
23.10.2017, 23:26 | #8 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
на что ему реагировать? там ж старые никуда не деваются.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
23.10.2017, 23:55 | #9 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
|
24.10.2017, 00:08 | #10 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
Ээээ...у вас на светофорах Windows стоит? ... потому что бывают еще и встроеные явы, и там, скорее всего, все по другому пишится. Без всяких JFrame.
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Выделение памяти под матрицу | yakimechik | Общие вопросы C/C++ | 1 | 22.01.2016 08:33 |
Переполнение/утечка памяти программы - C# | KiPiK | C# (си шарп) | 12 | 23.12.2015 12:33 |
JVM и новые версии Java | WizarD.89 | Общие вопросы по Java, Java SE, Kotlin | 6 | 06.07.2013 11:51 |
выделение памяти под массив на C | Kingdom_Reborn | Помощь студентам | 12 | 12.01.2011 04:40 |
Высвобождение памяти из под указателей | Gypsy | Общие вопросы Delphi | 4 | 27.01.2010 13:53 |