Модераторы: javastic, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> java.lang.OutOfMemoryError 
:(
    Опции темы
unkis
  Дата 22.5.2006, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



Ребята обясните пожалуйста тако парадокс.

Код

 public String textAusDateiLesen(String fileName, long skip)
        {
          String data="";
              try {
                    InputStream iStream = getClass().getResourceAsStream(fileName);
                    InputStreamReader isReader = new InputStreamReader(iStream);
                    int i=0;
                        isReader.skip(skip);
                    int symbol = isReader.read();
                    if (symbol != -1) {
                        do {
                             data+=((char)symbol);
                             symbol = isReader.read();
                            
                        } while (symbol != -1);
                    }
                        isReader.reset();
                            iStream.reset();
                          isReader.close();
                    iStream.close();
                      
                } catch (Exception ex) {
                    System.out.println("Error: " + ex);
                }
            
               
                
                 
                 
                 
                 
       return data;
           
        }



вот этот кусок кода вызывается два раза, сначало он читает один файл, а птом другой. Так вот когда этот метод вызывается второй раз то он выбрасывает ошибку java.lang.OutOfMemoryError вот в этом месте.
Код

     InputStream iStream = getClass().getResourceAsStream(fileName);


непонятно почему второй раз он даже не начинает читать.

Зарания благодарен. 


--------------------
www.unkis.com
PM MAIL WWW   Вверх
powerOn
Дата 22.5.2006, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: нет
Всего: 159



Какой размер файла, на котором вылетает исключение? 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Dancer
Дата 22.5.2006, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



перед return data; воткни вот этот метод:
Код

public void memoryClean() {
    Log("Total Memory: " +Runtime.getRuntime().totalMemory());
    Log("Freel Memory: " +Runtime.getRuntime().freeMemory());

System.gc();
System.gc();
try {
    Thread.sleep(1000);
catch(Exception sl_exc) {
}
System.gc();
System.gc();

    Log("Total Memory: " +Runtime.getRuntime().totalMemory());
    Log("Freel Memory: " +Runtime.getRuntime().freeMemory());

}

public void Log(String str) {
    System.out.println(str);
}
 


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
unkis
Дата 22.5.2006, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



так тоже не помагает.

Код

Total Memory: 500000
Freel Memory: 364228
Total Memory: 500000
Freel Memory: 442124




Цитата

Какой размер файла, на котором вылетает исключение?  


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

Код

 InputStream iStream = getClass().getResourceAsStream(fileName);


закрывается всё приложение 


--------------------
www.unkis.com
PM MAIL WWW   Вверх
Dancer
Дата 22.5.2006, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



да, ещё замени вычетку из файла посимвольно. Используй массив, а то на этом ты тоже терять начинаешь и в скоросте и в памяти. выложи свои фалики которые пытаешься читать (и есил возможно код, ну или хотя бы кусок который легко в мидлет переделать и погонять), попробую посмотеть при наличии времени.
Плюс, что за аппарат. Да, и ещё, ошибка то возникает на эмуляторе, или на живом аппарате? 


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
unkis
  Дата 23.5.2006, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



ошибка, возникает на эмуляторе, который идёт в комплекте с NetBeans.

Вот код.
Код

 public void pauseApp() {
    }
    
    public void destroyApp(boolean unconditional) {
    }
    
   
     public String textAusDateiLesen(String fileName, long skip)
      {
          String data="";
              try {
                    InputStream iStream = getClass().getResourceAsStream(fileName);
                    InputStreamReader isReader = new InputStreamReader(iStream);
                    int i=0;
                        isReader.skip(skip);
                    int symbol = isReader.read();
                    if (symbol != -1) {
                        do {
                             data+=((char)symbol);
                             symbol = isReader.read();
                            
                        } while (symbol != -1);
                    }
                        isReader.reset();
                            iStream.reset();
                          isReader.close();
                    iStream.close();
                      
                } catch (Exception ex) {
                    System.out.println("Error: " + ex);
                }
             
            memoryClean();
       return data;
           
      }

     public void memoryClean() {
        Log("Total Memory: " +Runtime.getRuntime().totalMemory());
        Log("Freel Memory: " +Runtime.getRuntime().freeMemory());
        System.gc();
        System.gc();
        try {
            Thread.sleep(1000);
        }
        catch(Exception sl_exc) {
        }
        System.gc();
        System.gc();
        Log("Total Memory: " +Runtime.getRuntime().totalMemory());
        Log("Freel Memory: " +Runtime.getRuntime().freeMemory());
    }

     public void Log(String str) {
         System.out.println(str);
       }


      
       public String getSmsText(String fileName, long skip)
        {
          String data="";
              try {
                    InputStream iStream = getClass().getResourceAsStream(fileName);
                    InputStreamReader isReader = new InputStreamReader(iStream);
                    int i=0;
                        isReader.skip(skip);
                    int symbol = isReader.read();
                    if (symbol != -1) {
                        do {
                             data+=((char)symbol);
                                 System.out.println(data);
                             symbol = isReader.read();
                            
                        } while ((((char)symbol)!='\r')||(symbol!=-1));
                    }
                        isReader.close();
                    iStream.close();
                } catch (Exception ex) {
                    System.out.println("Error: " + ex);
                }
        
       return data;
           
        }


и вот ссылка на файлы

Идея простая, в файле sms.txt на каждой строчке стоит одно сообщение, длина этих строчек записанно в файле index.sms.

В канечном итоге выбирается какая-то строчка и вычитывается из sms.txt.

Вот и всё.
Почему-то у меня выдаёт сбж. 

Зарания благодарен. 


--------------------
www.unkis.com
PM MAIL WWW   Вверх
Dancer
Дата 24.5.2006, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



а полный код можно привести? с тем откуда и как у тебя твои методы вызываются и даже какие файлики и как ты используешь. (у меня времени нету это всё дописывать и делать сколько нито запускаемый мидлет, для того чтобы проверить твои методы)
Сделай MIDlet, исходник которого я могу взять и сразу запустить и что-то посмотреть, а не пытаться дописать что-то, чтобы попасть в то, что ты у себя используешь.
Не хочется исходники свои светить, можешь в личку кинуть.  


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
unkis
Дата 24.5.2006, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



Конечно могу, вот весь проект написан на Netbeans 
>>>>download<<<< 


--------------------
www.unkis.com
PM MAIL WWW   Вверх
unkis
Дата 26.5.2006, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



ну что никто не знает в чём проблема? 


--------------------
www.unkis.com
PM MAIL WWW   Вверх
Dancer
Дата 26.5.2006, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



у тебя код кривой, более детальный анализ не делал, по у тебя постоянно в цикле бегает вычитка из файл и ты из своего цикла нифига не выходишь.
Более детально не могу сказать, так как времени на анализ не было. Просто лишь пару раз запустил на WTK симуляторе.
Есил терпит до понедельника, то в выходные посмотрю, а сейчас просто завал. 


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
Zandr
Дата 26.5.2006, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 433
Регистрация: 16.7.2004
Где: Новосибирск

Репутация: нет
Всего: 13



WTF?
Цитата(unkis @  22.5.2006,  05:17 Найти цитируемый пост)

                    int symbol = isReader.read();
                    if (symbol != -1) {
                        do {
                             data+=((char)symbol);
                             symbol = isReader.read();
                            
                        } while (symbol != -1);
                    }


Проблему не решает, но все же лучше так:
Код

data = new StringBuffer(вот тут желательно помутить с нач. емкостью);
...
int c;
while (-1 != (c = isReader.read())) {
    data.append((char) c);
}

 
PM MAIL   Вверх
unkis
Дата 26.5.2006, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



Цитата(Dancer @ 26.5.2006,  12:49)
у тебя код кривой, более детальный анализ не делал, по у тебя постоянно в цикле бегает вычитка из файл и ты из своего цикла нифига не выходишь.
Более детально не могу сказать, так как времени на анализ не было. Просто лишь пару раз запустил на WTK симуляторе.
Есил терпит до понедельника, то в выходные посмотрю, а сейчас просто завал.

ok, спасибо, конечно подождет до понедельника. 


--------------------
www.unkis.com
PM MAIL WWW   Вверх
unkis
Дата 1.6.2006, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



ребята, так в чём же у меня проблема? 


--------------------
www.unkis.com
PM MAIL WWW   Вверх
Dancer
Дата 1.6.2006, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



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

            int size = index.size();
            int elm = Integer.parseInt((index.elementAt(r.nextInt(size)))+"");
    
            long skip=0;
            for (int i = 0; i < size; i++) {
                skip+=Long.parseLong(index.elementAt(i)+"");
            }


я поправил на 
Код

            int size = index.size();
            int elm = Integer.parseInt((index.elementAt(r.nextInt(size)))+"");
    
            long skip=0;
            for (int i = 0; i < elm; i++) {
                skip+=Long.parseLong(index.elementAt(i)+"");
            }


так оно логичнее.
Плюс тут есть ещё над чем поработать и что с оптимизировать. Но в целом, картина уже прояснилась и работает smile
Но а то что не в понедельник, ну милок звини, у всех работа ещё своя имеется smile
полностью код смотри НИЖЕ. 
Думаю проанализировать и понять что у тебя и где было не так ты сможешь, если нет....... тут тогда тебе уже точно никто не поможет.

За сим, разшрешите откланиться.

Код

/*
 * FunySms.java
 *
 * Created on 19. Mai 2006, 13:24
 */


//import com.sun.midp.lcdui.Text;
import java.io.*;
import java.util.*;
import javax.microedition.io.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

/**
 *
 * @author Unkis
 */
public class SMSSeek extends MIDlet implements CommandListener {
    
    private String[] mygroup = {"Send via SMS","New SMS","Exit"};
    private double time;
    private Vector index = new Vector();
    
/** Creates a new instance of FunySms */
    public SMSSeek() {
        initialize();
    }
    
    private Form hauptForm;//GEN-BEGIN:MVDFields
    private Command exitCommand1;
    private Command okCommand1;
    private Command nextTextCommand;
    private Display disp;
    private TextField smsField;//GEN-END:MVDFields
    
//GEN-LINE:MVDMethods

    /** Called by the system to indicate that a command has been invoked on a particular displayable.//GEN-BEGIN:MVDCABegin
     * @param command the Command that ws invoked
     * @param displayable the Displayable on which the command was invoked
     */
    public void commandAction(Command command, Displayable displayable) {//GEN-END:MVDCABegin
    // Insert global pre-action code here
        if (displayable == hauptForm) {//GEN-BEGIN:MVDCABody
            if (command == nextTextCommand) {
                nextSmsGeneration();
            } else if (command == okCommand1) {//GEN-END:MVDCABody
                // Insert pre-action code here
                // Do nothing//GEN-LINE:MVDCAAction10
                // Insert post-action code here
            } else if (command == exitCommand1) {//GEN-LINE:MVDCACase10
                // Insert pre-action code here
                exitMIDlet();//GEN-LINE:MVDCAAction8
                // Insert post-action code here
            }//GEN-BEGIN:MVDCACase8
        }//GEN-END:MVDCACase8
    // Insert global post-action code here
    }//GEN-LINE:MVDCAEnd

    /** This method initializes UI of the application.//GEN-BEGIN:MVDInitBegin
     */
    private void initialize() {//GEN-END:MVDInitBegin
        String tempSms = textAusDateiLesen("index.sms",0);

        try {
            int startIndex = 0;
            int endIndex = 0;
            while((endIndex=tempSms.indexOf(",",startIndex)) > -1 ) { 
                index.addElement(tempSms.substring(startIndex,endIndex));
                startIndex = endIndex+1;
            }
            index.addElement(tempSms.substring(startIndex));
            tempSms = null;
            memoryClean();
        } catch (Exception ex) {
            ex.printStackTrace();
        }


        // Insert pre-init code here
        smsField = new TextField("SMS", null, 120, TextField.ANY);//GEN-BEGIN:MVDInitInit
        disp = getDisplay();
        disp.setCurrent(get_hauptForm());//GEN-END:MVDInitInit
        // Insert post-init code here
    }//GEN-LINE:MVDInitEnd
    
    /**
     * This method should return an instance of the display.
     */
    public Display getDisplay() {//GEN-FIRST:MVDGetDisplay
        return Display.getDisplay(this);
    }//GEN-LAST:MVDGetDisplay
    
    /**
     * This method should exit the midlet.
     */
    public void exitMIDlet() {//GEN-FIRST:MVDExitMidlet
        getDisplay().setCurrent(null);
        destroyApp(true);
        notifyDestroyed();
    }//GEN-LAST:MVDExitMidlet

    /** This method returns instance for hauptForm component and should be called instead of accessing hauptForm field directly.//GEN-BEGIN:MVDGetBegin6
     * @return Instance for hauptForm component
     */
    public Form get_hauptForm() {
        if (hauptForm == null) {//GEN-END:MVDGetBegin6
            // Insert pre-init code here
            hauptForm = new Form(null, new Item[] {smsField});//GEN-BEGIN:MVDGetInit6
            hauptForm.addCommand(get_exitCommand1());
            hauptForm.addCommand(get_okCommand1());
            hauptForm.addCommand(get_nextTextCommand());
            hauptForm.setCommandListener(this);//GEN-END:MVDGetInit6
            // Insert post-init code here
        }//GEN-BEGIN:MVDGetEnd6
        return hauptForm;
    }//GEN-END:MVDGetEnd6

    public Command get_nextTextCommand() {
        if (nextTextCommand == null) {
            nextTextCommand = new Command("NextSMS", Command.OK, 1);
        }
        return nextTextCommand;
    }

    /** This method returns instance for exitCommand1 component and should be called instead of accessing exitCommand1 field directly.//GEN-BEGIN:MVDGetBegin7
     * @return Instance for exitCommand1 component
     */
    public Command get_exitCommand1() {
        if (exitCommand1 == null) {//GEN-END:MVDGetBegin7
            // Insert pre-init code here
            exitCommand1 = new Command("Exit", Command.EXIT, 1);//GEN-LINE:MVDGetInit7
            // Insert post-init code here
        }//GEN-BEGIN:MVDGetEnd7
        return exitCommand1;
    }//GEN-END:MVDGetEnd7

    /** This method returns instance for okCommand1 component and should be called instead of accessing okCommand1 field directly.//GEN-BEGIN:MVDGetBegin9
     * @return Instance for okCommand1 component
     */
    public Command get_okCommand1() {
        if (okCommand1 == null) {//GEN-END:MVDGetBegin9
            // Insert pre-init code here
            okCommand1 = new Command("Ok", Command.OK, 1);//GEN-LINE:MVDGetInit9
            // Insert post-init code here
        }//GEN-BEGIN:MVDGetEnd9
        return okCommand1;
    }//GEN-END:MVDGetEnd9
 
 

    private void nextSmsGeneration() {
        try {
            Random r = new Random();
            int size = index.size();
            int elm = Integer.parseInt((index.elementAt(r.nextInt(size)))+"");
    
            long skip=0;
            for (int i = 0; i < elm; i++) {
                skip+=Long.parseLong(index.elementAt(i)+"");
            }

            String tempSms = getSmsText("sms1.txt",skip, Long.parseLong(index.elementAt(elm)+""));
            String sms2 = new String(tempSms.getBytes(),"windows-1251");
            smsField.setMaxSize(sms2.length());
            smsField.setString(sms2);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        disp.setCurrent(get_hauptForm());
    }
    
    
    public void startApp() {
        nextSmsGeneration();
    }
    
    public void pauseApp() {
    }
    
    public void destroyApp(boolean unconditional) {
    }
    
   
    public String textAusDateiLesen(String fileName, long skip) {
        String data="";
        try {
            InputStream iStream = getClass().getResourceAsStream(fileName);
            InputStreamReader isReader = new InputStreamReader(iStream);
            int i=0;
            isReader.skip(skip);
            int symbol = isReader.read();
            if (symbol != -1) {
                do {
                    data+=((char)symbol);
                    symbol = isReader.read();
                } while (symbol != -1);
            }
            iStream.close();
                      
        } catch (Exception ex) {
            System.out.println("Error in textAusDateiLesen(): " + ex);
        }
             
        memoryClean();
        return data;
    }

    public void memoryClean() {
        memoryClean(false);
    }

    public void memoryClean(boolean showLog) {
        if(showLog) {
            Log("====== MeM Status ======");
            Log("Total Memory: " +Runtime.getRuntime().totalMemory());
            Log("Freel Memory: " +Runtime.getRuntime().freeMemory());
        }

        System.gc();
        System.gc();

        try {
            Thread.sleep(1000);
        }
        catch(Exception sl_exc) {
        }

        System.gc();
        System.gc();

        if(showLog) {
            Log("Total Memory: " +Runtime.getRuntime().totalMemory());
            Log("Freel Memory: " +Runtime.getRuntime().freeMemory());
            Log("===============\n");
        }
    }

    public void Log(String str) {
        System.out.println(str);
    }

    public String getSmsText(String fileName, long skip, long getSymbols) {
        String data="";
        try {
            InputStream iStream = getClass().getResourceAsStream(fileName);
            InputStreamReader isReader = new InputStreamReader(iStream);
            int i=0;
            isReader.skip(skip);
            int symbol = isReader.read();
            i++;
            if (symbol != -1) {
                do {
                    data+=((char)symbol);
                    symbol = isReader.read();
                } while (i++ != getSymbols);
            }
            iStream.close();
        } catch (Exception ex) {
            System.out.println("Error in getSmsText(): " + ex);
        }
        memoryClean();
        return data;
    }

}

 


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
Dancer
Дата 2.6.2006, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



фигню сморозил, сорри 

Это сообщение отредактировал(а) Dancer - 2.6.2006, 09:49


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0756 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.