Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2017, 20:25   #1
king-live
Пользователь
 
Регистрация: 02.12.2012
Сообщений: 12
По умолчанию Переполнение памяти под JVM

Доброго времени суток! Я начинающий программист JAVA. Пишу уже лет семь под "С" для микроконтроллеров. Но есть необходимость писать прикладные программы для компьютера и android устройств. Осваиваю вывод растровой графики в JAVA. Скопировал программу и видоизменил под себя.

Код:

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;

/**
 * This class demonstrates how to load an Image from an external file
 */

public class LoadImageApp extends Component {
	static byte c;
//	static byte b;
//   static byte a;
    
    BufferedImage img;
    BufferedImage img2;
    
    public void paint(Graphics g)
    {
        c++;
        if(c>2)
        {
            g.drawImage(img, 0, 0, null);
        }
        else 
        {
            g.drawImage(img2, 0, 0, null);
        }
    if(c>4)c=0;
    }

    public LoadImageApp()
    {
    	try
    	{
    		img2 = ImageIO.read(new File("src/K26.png"));
    		img = ImageIO.read(new File("src/K25.png"));
       } 
      
       catch (IOException e)
       {
           ;
       }
    }

    public Dimension getPreferredSize()
    {
        if ((img == null)||(img2 == null))
        {
             return new Dimension(2000,1000);
        }
        else
        {
            return new Dimension(img.getWidth(null), img.getHeight(null));
          
        }
    
    }

    public static void main(String[] args) {

        JFrame f = new JFrame("Load Image Sample");
            
        f.addWindowListener(new WindowAdapter(){
                public void windowClosing(WindowEvent e) {
                   System.exit(0);
                    ;
                }
            });
        
        for(;;)
        {
            f.add(new LoadImageApp());
            f.pack();
            f.setVisible(true);
       }
    }
}
Код выводит две картинки по очереди!
Изучаю готовый код подставляя какие нибудь значения или изменяя, дополняя какие нибудь строки. Так как комментарии к кодам очень скудные. А книги не все читабельны, чтобы было понятно. Код работает но тормозит на 5-6 секунде. Понятно что память отведённая под JVM перегружается. Но начинающему трудно определить вообще где кроится ошибка. Только не отсылайте на те или иные сайты, а лучше помогите с этим кодом и желательно прокомментируйте для чего какие строки нужны. Буду очень благодарен. Спасибо заранее.
king-live вне форума Ответить с цитированием
Старый 23.10.2017, 21:06   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А зачем цикл в main?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 23.10.2017, 21:21   #3
king-live
Пользователь
 
Регистрация: 02.12.2012
Сообщений: 12
По умолчанию

Я только учусь и поэтому не знаю как правильно выводить по очереди две картинки в бесконечном цикле.
king-live вне форума Ответить с цитированием
Старый 23.10.2017, 21:24   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

По очереди это как? Что сделать-то надо?

Вы ж тут просто создаете бесконечное число картинок (причем так быстро, что человек вряд ли заметит), а память не бесконечная.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 23.10.2017, 21:36   #5
king-live
Пользователь
 
Регистрация: 02.12.2012
Сообщений: 12
По умолчанию

Две картинки заменяют друг друга в бесконечном цикле. У меня на диске они именуются K26 и K25.
king-live вне форума Ответить с цитированием
Старый 23.10.2017, 21:40   #6
king-live
Пользователь
 
Регистрация: 02.12.2012
Сообщений: 12
По умолчанию

и как создаются временный задержки в JAVA нигде толком не описаны. А вообще картинки должны заменять друг друга с периодом в пол секунды. Это на железнодорожный светофор на переезде.
king-live вне форума Ответить с цитированием
Старый 23.10.2017, 23:07   #7
alexzk
Форумчанин
 
Регистрация: 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.
alexzk вне форума Ответить с цитированием
Старый 23.10.2017, 23:26   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
память потребляется быстрее, чем реагирует gc.
на что ему реагировать? там ж старые никуда не деваются.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 23.10.2017, 23:55   #9
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
на что ему реагировать? там ж старые никуда не деваются.
ага, досмотрел. Все в компонент добавляются.
alexzk вне форума Ответить с цитированием
Старый 24.10.2017, 00:08   #10
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от king-live Посмотреть сообщение
и как создаются временный задержки в JAVA нигде толком не описаны. А вообще картинки должны заменять друг друга с периодом в пол секунды. Это на железнодорожный светофор на переезде.
Ээээ...у вас на светофорах Windows стоит? ... потому что бывают еще и встроеные явы, и там, скорее всего, все по другому пишится. Без всяких JFrame.
alexzk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделение памяти под матрицу 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