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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему не очищаеться память? 
:(
    Опции темы
unkis
Дата 8.1.2009, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ребята у меня вот такая вот проблема

Есть программа, которая раз в минуту скачивает 30 страничек паралельно, потом она парсит и создаёт где-то 30 объектов этих страниц.
При помощи hibernate в H2 сохраняются эти объекты.
Как  я уже сказал выше, весь это цикл выполняется каждую минуту.

В Netbeans есть Profiler, я залез посмотреть, что же всё таки происходит и вот увидел вот такую вот картинку.

user posted image

Как видно из картинки, больше всего памяти забирает char[], и показатель  увеличивается с каждым  повтором(каждую минуту).

Я так понимаю, что char[] увеличивается каждый раз когда скачивается страница из интернета.

Вот мой код для скачивания страницы.
Код

 StringBuffer page_autoList = new StringBuffer();

            HttpClient httpClient = new HttpClient();
            httpClient.getParams().setContentCharset(DEFAULT_CHARSET);
            httpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);


            // Загрузка страницы с запросом методом GET
            GetMethod getMethod = new GetMethod(URL);
            getMethod.getParams().setContentCharset(SITE_CHARSET);
            getMethod.setRequestHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 6.0; Windows NT)");

            try {
                int result = httpClient.executeMethod(getMethod);
                if (result == HttpStatus.SC_OK) {
                  
                    // Выводим страницу на экран
                    String tempPage = getMethod.getResponseBodyAsString();
//                    System.out.println(page);
//                     Выводим страницу в файл
                    //TODO убрать запись в файл
                    FileWriter f = new FileWriter(fileName + ".html");
                    f.write(tempPage);
                    f.close();
                    // Добовляем страницу в буффер
                    page_autoList.append(getMethod.getResponseBodyAsString());
                } else {
                    
                    return null;
                }
            } catch (IOException e) {
                System.out.println("Проблемы со связью");
                e.printStackTrace();
                System.exit(1);
                return null;
            } finally {
                getMethod.releaseConnection();
            }
            Logger.getLogger(ParuvenduAutoDetails.class.getName()).log(Level.INFO, " End");
            return page_autoList;


Может где-то здесь память утекает?

Вот и вопрос почему же память не очищается?


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


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

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



А что ты дальше с page_autoList делаешь?


--------------------
Lost....
PM MAIL MSN   Вверх
unkis
Дата 8.1.2009, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Создаётся объект и при вызове конструктора вызывается метод getAutoListPage.

А этом классе находятся методы которые  работают с page
Вот код, методы убрал так как слишком длинные они
Код

public class A {

    private final String URL;
    private static final String DEFAULT_CHARSET = "UTF-8";
    private static final String SITE_CHARSET = "ISO-8859-1";
    private boolean getAutoListOk = false;
    private final String DOMAIN;
    private final String URL_PARAM;
    private final String SITE_ROOT;
    private StringBuffer page = null;
    private String queriID;



    public A(final String DOMAIN, final String URL_PARAM, String queriID) {
        this.DOMAIN = DOMAIN;
        this.URL_PARAM = URL_PARAM;
        this.URL = "http://" + DOMAIN + URL_PARAM;
        this.SITE_ROOT = "http://" + DOMAIN;
        this.page = getAutoListPage(queriID);
        this.queriID = queriID;

    }

    private StringBuffer getAutoListPage(String fileName) {
        Logger.getLogger(Paruvendu_fr_AutoList.class.getName()).log(Level.INFO, " Start");
        if (URL != null) {
            StringBuffer page_autoList = new StringBuffer();

            HttpClient httpClient = new HttpClient();
            httpClient.getParams().setContentCharset(DEFAULT_CHARSET);
            httpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);

            // Загрузка страницы с запросом методом GET
            GetMethod getMethod = new GetMethod(URL);
            getMethod.getParams().setContentCharset(SITE_CHARSET);
            try {
                int result = httpClient.executeMethod(getMethod);
                if (result == HttpStatus.SC_OK) {
                    // Выводим страницу на экран
                    String tempPage = getMethod.getResponseBodyAsString();
//                    System.out.println(page);
//                     Выводим страницу в файл
                    //TODO убрать запись в файл
                    FileWriter f = new FileWriter(fileName + ".html");
                    f.write(tempPage);
                    f.close();
                    // Добовляем страницу в буффер
                    page_autoList.append(getMethod.getResponseBodyAsString());
                } else {
                    System.out.println("A stranichka ne gruzit'sja!!!");
                    return null;
                }
            } catch (IOException e) {
                System.out.println("Проблемы со связью");
                e.printStackTrace();
                System.exit(1);
                return null;
            } finally {
                getMethod.releaseConnection();
                getAutoListOk = true;
            }
            Logger.getLogger(Paruvendu_fr_AutoList.class.getName()).log(Level.INFO, " End");
            return page_autoList;
        } else {
            return null;
        }
    }
......
другие методы
......
}


Добавлено через 3 минуты и 8 секунд

тоесть получается, что где-то висит ссылка на это класс?


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


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

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



Цитата(unkis @  8.1.2009,  22:01 Найти цитируемый пост)
private StringBuffer getAutoListPage(String fileName) {

Вот этим методом ты получаешь StringBuffer. И дальше где-то он висит...


--------------------
Lost....
PM MAIL MSN   Вверх
unkis
Дата 8.1.2009, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я это делаю в конструкторе

this.page = getAutoListPage(queriID);

тоесть получается, что где-то висит ссылка на это класс? 


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


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



unkis, из всего что ты привел все равно не понятно что ты делаешь с этими страницами. Ты их сохраняешь в базу как есть? В сохраняемых в базу объектах есть атибут с типом char[]? Если так, то как у тебя настроено кэширование второго уровня в Hibernate? Вполне возможно что эти объекты хранятся именно в кэше.
PM MAIL Skype GTalk Jabber YIM   Вверх
Shurr
Дата 9.1.2009, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



unkis
Нарастание потребления памяти приводит к OutOfMemory, или просто интересно почему так? Если при длительной работе OutOfMemory не выпадает - возможно просто за наблюдаемый промежуток времени не вызывался сборщик мусора, т.к. памяти пока хватает.
PM MAIL   Вверх
unkis
Дата 9.1.2009, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пока OutOfMemory небыло, понятно, будум наблюдать.
Вопрос сколько по defaultu памяти выделяется под java?


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


Шустрый
*


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

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



Цитата(unkis @  9.1.2009,  14:16 Найти цитируемый пост)
Вопрос сколько по defaultu памяти выделяется под java?

Зависит от вендора и версии JVM, Sun вроде говорит о 32 Мб в клиентском режиме и 64 Мб в серверном.
PM MAIL   Вверх
unkis
Дата 10.1.2009, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот дождался выкинула OutOfMamory.
А как можно сказать hibernate чтобы он очищал свой кэш?
Может мне посмотреть в сторону Reference, там как-то было Soft reference и так далее?

Добавлено через 1 минуту и 13 секунд
и при помощи чего можно посмотреть, какие объекты остаются в памяти?


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


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Цитата(unkis @  10.1.2009,  00:50 Найти цитируемый пост)
А как можно сказать hibernate чтобы он очищал свой кэш?

По умолчанию кэш второго просто выключен. Если у тебя в конфигурации Hibernate есть что-то типа 
Цитата

hibernate.cache.provider_class=net.sf.ehcache.hibernate.EhCacheProvider

и тэги <cache>, то надо видимо их убирать. 

Прежде конечно надо разобраться где именно утечка.
PM MAIL Skype GTalk Jabber YIM   Вверх
unkis
Дата 11.1.2009, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот меня всегда интересовало, как именно разбираться, какими средствами?

И как насчёт того чтобы может использовать Reference, там как-то было Soft reference и так далее?


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

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

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


 




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


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

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