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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятная "утечка" памяти, заполнение памяти выше всяких расчетов.. 
:(
    Опции темы
hydrargyrum
Дата 7.7.2009, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет!
В довольно обширном куске обнаружилась непонятная "утечка" памяти.
Вот значимый кусок кода:
Код

rs.beforeFirst();
    while(rs.next())
    {
        if(ind == -1)
        {
            skiptillnexticker = true;
            ind = mx - 1;
        }
        curticker = rs.getString("ticker");
        if(!skiptillnexticker)
        {
            date = (Date) rs.getDate("date");
            if(BarSize.day != tradestrategy.getSettings().getBarsize())
                time = (Time) rs.getTime("time");
            else
                time = new Time(0);
            cal.setTimeInMillis(date.getTime() + time.getTime());
            dt = new DateTime(cal);
            
            bar = new Bar(curticker, dt);                        
            bars[ind--] = bar;
        }
        if(ticker.length() > 0)
        {
            if(!curticker.equals(ticker))
            {
                if(++loaded % 10 == 0){
                    System.out.println((getAssetsCount() - loaded) + " to load left");
                    totmem = runtime.totalMemory() / 1024;
                    freemem =  runtime.freeMemory() / 1024;
                    memused = totmem - freemem;
                    System.out.println(loaded + " created: total = " + totmem + 
                                "Kb, free = " + freemem + "Kb, used = " + memused + "Kb");
                    //temp debug
                    if(getAssetsCount() - loaded == 195){
                        System.currentTimeMillis();
                    }
                }
            }
        }
    }
    totmem = runtime.totalMemory();
    freemem =  runtime.freeMemory();
    memused = totmem - freemem;
    System.out.println(loaded + " created. Before close: total = " + totmem + 
            ", free = " + freemem + ", used = " + memused);
    rs.getStatement().close();
    rs.close();
    rs = null;
    totmem = runtime.totalMemory();
    freemem =  runtime.freeMemory();
    memused = totmem - freemem;
    System.out.println(loaded + " created. After close: total = " + totmem + 
            ", free = " + freemem + ", used = " + memused);

этот кусок вложен в другой цикл.
Узкое место такое:
Код

date = (Date) rs.getDate("date");
            if(BarSize.day != tradestrategy.getSettings().getBarsize())
                time = (Time) rs.getTime("time");
            else
                time = new Time(0);
            cal.setTimeInMillis(date.getTime() + time.getTime());
            dt = new DateTime(cal);

Память зажирается выше всяких расчетов. Вот выдержка из лога:
70 created: total = 42616Kb, free = 16134Kb, used = 26482Kb
545 to load left
80 created: total = 42616Kb, free = 14608Kb, used = 28008Kb
535 to load left
90 created: total = 42616Kb, free = 15578Kb, used = 27038Kb
99 created. Before close: total = 43638784, free = 14683088, used = 28955696
99 created. After close: total = 43638784, free = 14683088, used = 28955696
525 to load left
100 created: total = 44220Kb, free = 16010Kb, used = 28210Kb
...
400 created: total = 65088Kb, free = 4343Kb, used = 60745Kb
215 to load left
410 created: total = 65088Kb, free = 448Kb, used = 64640Kb
205 to load left
420 created: total = 65088Kb, free = 448Kb, used = 64640Kb
195 to load left
430 created: total = 65088Kb, free = 448Kb, used = 64640Kb
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.nio.CharBuffer.wrap(Unknown Source)
    at java.nio.CharBuffer.wrap(Unknown Source)

Если этот кусок заменить на:
Код

date = new Date(System.currentTimeMillis());
            time = new Time(System.currentTimeMillis());
            cal.setTimeInMillis(date.getTime() + time.getTime());
            dt = new DateTime(cal);

то все нормально:
70 created: total = 25832Kb, free = 7594Kb, used = 18238Kb
545 to load left
80 created: total = 25832Kb, free = 7103Kb, used = 18729Kb
535 to load left
90 created: total = 25832Kb, free = 8321Kb, used = 17511Kb
99 created. Before close: total = 26451968, free = 8447184, used = 18004784
99 created. After close: total = 26451968, free = 8447184, used = 18004784
525 to load left
100 created: total = 25832Kb, free = 8757Kb, used = 17075Kb
...
25 to load left
600 created: total = 25832Kb, free = 4460Kb, used = 21372Kb
15 to load left
610 created: total = 25832Kb, free = 2965Kb, used = 22867Kb
5 to load left
620 created: total = 25832Kb, free = 4150Kb, used = 21682Kb
624 created. Before close: total = 26451968, free = 3605240, used = 22846728
624 created. After close: total = 26451968, free = 3605240, used = 22846728
Loaded in 49375 msecs

СУБД – PostreSQL 8.3.4

Подскажите, где тут собака порылась?
PM MAIL   Вверх
hydrargyrum
Дата 7.7.2009, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



тут вот какое дело:
Код

date = (Date) rs.getDate("date");
if(BarSize.day != tradestrategy.getSettings().getBarsize())
    time = (Time) rs.getTime("time");
else
    time = new Time(0);
                                
date = new Date(System.currentTimeMillis());
time = new Time(System.currentTimeMillis());
                                
cal.setTimeInMillis(date.getTime() + time.getTime());
dt = new DateTime(cal);

такой код тоже не вызывает описанной проблемы 
Конструктор DateTime такой:
Код

public DateTime(GregorianCalendar _cal)
{
    this.year = _cal.get(Calendar.YEAR);
    this.month = _cal.get(Calendar.MONTH);
    this.day = _cal.get(Calendar.DAY_OF_MONTH);
    this.hour = _cal.get(Calendar.HOUR_OF_DAY);
    this.minute = _cal.get(Calendar.MINUTE);
    this.second = _cal.get(Calendar.SECOND);
    this.millisecond = _cal.get(Calendar.MILLISECOND);
}


ResultSet чистится после каждого цикла работы с ним. Там так: в большом цикле делается запрос к БД на выборку ~ 65 000 строк, потом они све разбираются в малом цикле, а потом
Код

totmem = runtime.totalMemory();
freemem =  runtime.freeMemory();
memused = totmem - freemem;
System.out.println(loaded + " created. Before close: total = " + totmem + 
            ", free = " + freemem + ", used = " + memused);
    rs.getStatement().close();
    rs.close();
    rs = null;
totmem = runtime.totalMemory();
freemem =  runtime.freeMemory();
memused = totmem - freemem;
System.out.println(loaded + " created. After close: total = " + totmem + 
        ", free = " + freemem + ", used = " + memused);

Этот кусок за все время работы вызывается 6 раз и не дает никаких результатов в осввобождении памяти
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




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


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

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