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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> виснет приложение после N запросов 
:(
    Опции темы
4epT
Дата 20.4.2011, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В логах томкета увидел вот такое:
Код

WARNING: Could not find configuration [org.hibernate.cache.StandardQueryCache]; using defaults.
Hibernate: 
    /* delete olly.entity.Country */ delete 
        from
            st.countries 
        where
            id=?
20.04.2011 9:19:56 org.hibernate.connection.DriverManagerConnectionProvider close
INFO: cleaning up connection pool: null
20.04.2011 9:19:56 com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback visit
SEVERE: javax.el.ELException: /admin/countryDelete.xhtml @16,82 value="#{countryController.allCountry}": Error reading 'allCountry' on type olly.managers.CountryManager
20.04.2011 9:20:02 org.hibernate.connection.DriverManagerConnectionProvider close
INFO: cleaning up connection pool: null


такое написало после удаления второй страны, потом метод jsf бина getAllCountry уже не смог прочитать страны:
Код

Error reading 'allCountry' on type olly.managers.CountryManager


Это не похоже на ошибку ?)

PM MAIL   Вверх
4epT
Дата 20.4.2011, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Выяснил что приложение ложиться из за:
Код

java.lang.OutOfMemoryError: PermGen space


Смотрел через профайлер, когда доставал список стран было видно что очень сильно скакнула память ... памяти выделил 512 метров, каким образом так быстро память улетает ? Что с этим делать?
PM MAIL   Вверх
dobrolub
Дата 20.4.2011, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

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



permGen используется для кэширования классов (в числе прочего) и в если ошибки будут продолжатся и далее, то нужно посмотреть где текут класслоадеры (java.lang.Classloader и его наследники)

для этого есть утилитка jmap, запускай её с ключом -permstat и смотри на результат. На винде она не работает с этим ключом к сож.

jmap -permstat <pid>

Добавлено через 5 минут и 23 секунды
для винды, чтото вроде http://www.yourkit.com/docs/kb/class_loaders.jsp о
PM   Вверх
4epT
Дата 20.4.2011, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Установил YourKit, попытался разобраться .... но очень много показателей и просто напросто запутался. Можете подсказать куда конкретно посмотреть ? Или может быть просто увеличить permsize ? 

нашел во вкладке Class List:
Код

Name                                   Number of Objects
olly.entity.country                             30
...
olly.managers.CountryManager         1
olly.dao.CountryDaoImpl                    1


есть еще один класс, объектов которого 51 ... но он не мой, он находится в пакете com.sun.org...

ну и есть 118 799 - java.lang.String  и примерно столько же char[]

p.s. Как часто вообще сталкиваются с такими проблемами ? Не у одного знакомого такого не было...

Это сообщение отредактировал(а) 4epT - 20.4.2011, 22:42
PM MAIL   Вверх
dobrolub
Дата 20.4.2011, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

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



в моей практике было пару раз. Причиной может быть количество классов в аппликухе (включая библиотеки, конечно) требующее больший permgen чем выделяется по умолчанию, или, "ClassLoader leak" - когда классы загружаюся в новый класслоадер снова и снова, и ссылка на класслоадер остаётся. 

первое просто требует увеличения permgen, второе -баг в аппликухе и его надо найти и исправить.

Добавлено через 2 минуты и 23 секунды
Если после увеличения до 512м у тебя ошибки прекратяться, то всё в порядке. Если будут продолжать лезть - найди наиболее повторяющийся класслоадер (г. типа org.spring org.hibernate ) и следи, не растёт ли их число .
PM   Вверх
4epT
Дата 20.4.2011, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не подскажешь как правильно увеличить permgen ?  )

я через IDE (netbeans) полез в настройки сервера и прописал там параметр: -XX:MaxPermSize=512m
PM MAIL   Вверх
dobrolub
Дата 20.4.2011, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

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



catalina.bat декларирует несколько параметеров; твой - JAVA_OPTS

нужно установить присвоить переменной окружения ( Environmеnt Variable ) значиение  -XX:MaxPermSize=512m 

если запускаешь из коммандной строки сделай 

set JAVA_OPTS=-XX:MaxPermSize=512M
catalina.bat start


или установи её глобально, такоже как устанавливают JAVA_HOME, ANT_HOME, ORACLE_HOME и т.д.

Ну и конечно убедись что она действительно встала с помощью jvisualvm или jconsole
PM   Вверх
4epT
Дата 21.4.2011, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



dobrolub, увеличение permgen результата не дало ( какие самые распространенные баги в "аппликухе" ? Как выяснить где я напорол ? 
PM MAIL   Вверх
dobrolub
Дата 21.4.2011, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

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



Ну вот перезагрузка веб-аппликухи такой эффект может дать. В томкат 7 есть даже такая фишка - протекция против permgen leak. http://wiki.apache.org/tomcat/MemoryLeakProtection

Я думаю первый шаг - убедиться что ты на томкат 7, а потом анализировать дерево классов, смотреть что держит лоадеры которые растут в  числе. Ешё погугли на предмет permgen и библиотек которые в твоей аппликухе крутятся.
PM   Вверх
4epT
Дата 21.4.2011, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



скажите пожалуйста, а может ли быть проблема в неправильной конфигурации Spring / Hibernate ?

P.s. просто в плане архитектуры у меня сомнения в том что я  где то напорол ... так как весь дао списан с работы.  Единственное что сам писал так это файлы конфига + вместо Struts подключил JSF ...

Это сообщение отредактировал(а) 4epT - 21.4.2011, 17:24
PM MAIL   Вверх
4epT
Дата 21.4.2011, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Выяснил что метод getAllCountry за один сабмит вызывается три раза Оо.

вот код страницы:
Код

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.prime.com.tr/ui"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <p:growl autoUpdate="true" id="message" life="5" sticky="true"/>
            <p:panel header="Страны. Удаление." id="panel">
                <h:panelGrid columns="2">
                    <p:selectOneMenu effect="drop" style="width: 200px;" 
value="#{countryController.selectedCountryString}">
                        <f:selectItems value="#{countryController.allCountry}" />
                    </p:selectOneMenu>
                    <p:commandButton value="Удалить" actionListener="#{countryController.deleteCountry}"
 update="message,panel" style="width: 200px;" />
                </h:panelGrid>
            </p:panel>
        </h:form>
    </h:body>
</html>



А вот managed jsf bean:
Код

package olly.managers;

import java.io.Serializable;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import olly.dao.CountryDao;
import olly.entity.Country;
import olly.util.FacesUtil;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

@ManagedBean(name="countryController")
@ViewScoped
public class CountryManager implements Serializable{
    
    private CountryDao countryDao;
    private String selectedCountryString;
    private String countryName;
    
    public CountryManager(){
        
        WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(
                                        (ServletContext) FacesUtil.getExternalContext().getContext());
        countryDao = wac.getBean(CountryDao.class);
        
    }

    public SelectItem[] getAllCountry(){

        List<Country> lst = countryDao.list();
        SelectItem[] lstCountry = new SelectItem[lst.size()];
        
        for(int i = 0; i < lst.size(); i++){
            lstCountry[i] = new SelectItem(lst.get(i), lst.get(i).getCountry());
        }
        
        return lstCountry;
    }

    public void deleteCountry(){
        
        if( selectedCountryString == null || countryDao == null){
            return;
        }
        
        Country country = countryDao.getCountryByName(selectedCountryString);
        
        if(country != null) {
            countryDao.delete(country);
            
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage("Страна " + country.getCountry()
 + " успешно удалена."));
            
            //return "countryDelete";
        }
        else {
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage("Извините но произошла
 ошибка, попробуйте еще раз."));
            //return "countryDelete";
        }
    }

    public String getSelectedCountryString() {
        return selectedCountryString;
    }

    public void setSelectedCountryString(String selectedCountryString) {
        this.selectedCountryString = selectedCountryString;
    }

    public String getCountryName() {
        return countryName;
    }

    public void setCountryName(String countryName) {
        this.countryName = countryName;
    }
}


Как видно, я по "сабмиту" вызываю метод getAllCountry и потом перерисовываю панель. Каким образом метод вызывается 3 раза ?

2 раза вызывается - при нажатии на кнопку и один раз после удаления.
 

Это сообщение отредактировал(а) 4epT - 21.4.2011, 23:25
PM MAIL   Вверх
kaa
Дата 26.4.2011, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



4epT, сам сейчас только вникаю в тонкости JSF, но в общем троекратный вызов метода связан с жизненным циклом запроса.

Как только твой запрос пришёл на сервер, JSF пытается восстановить дерево страницы и провалидировать значения. После обработки он обновляет дерево страницы - и тоже запрашивает данные со всех бинов - глянь на код своей страницы. 

У тебя там есть запись 

Код

{#countryController.allCountry}


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

В общем кол-во вызовов функций, представляющих проперти бина, зависит от процесса обработки и компонента и может сильно разниться smile Проверено лично на примере RichFaces-овской модели таблицы - вот там перевызовы так перевызовы smile

Вообще работая с БД в JSF без кеша лучше не жить - жрёт память как бегемот и тупит как ленивец.

Добавлено @ 11:09
Попробуй в самом деле с хиберовскими кешами поиграться - может поможет?

Добавлено @ 11:11
Особое внимание удели кешу второго уровня. Он там по умолчанию отключен.

Это сообщение отредактировал(а) kaa - 26.4.2011, 11:11
PM MAIL   Вверх
4epT
Дата 26.4.2011, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо за ответ =) Я включил в настройках хибера использовать кеш второго уровня - это достаточно ? или лучше использовать специальные либы для кеша ?

Ну и на сколько я понял трехкратный вызов метода никак не исправить ?)

P.s. зависание больше не происходит ... исправил в baseDaoImpl метод - list. Сделал его @Transactional. 
PM MAIL   Вверх
kaa
Дата 27.4.2011, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Привет!

По поводу кэша: что-то я не слышал про сторонние либы для кеширования кишков хибера. Да и странно это было бы. Хибер-то лучше знает что ему надо - это он рулит ентити-объектами.

Про вызов: нет, это ядро JSF само дёргает, для своих нужд.


Уточнить просто хочется: после добавления @Transactional виснуть перестало?
PM MAIL   Вверх
4epT
Дата 28.4.2011, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да после добавления @Transactional виснуть перестало. И помойму я даже понял почему ... дело в том что висло при запросе select ... и видимо хибер делал не простой select а что то вроде select for update. И из за частого выполнения этого запроса ( из за JSF ) делался дед лок на базу и и за этого все висло.
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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