JSF+Spring+Hibernate consumindo muita memória em servidor remoto

8 respostas
DarthCego

Ola amigos

tenho uma aplicação que roda com JSF 2.1 Spring 3.1 Hibernate 3.6 tomcat 7 e Spring Security 3

em desenvolvimento ela funciona certinho porém quando fui fazer o deploy no servidor remoto começou a dar erro de permGen

Exception in thread "main" java.lang.OutOfMemoryError: PermGen space

minha duvida é a seguinte o servidor que aluguei no webhost.com.br tem apenas 128mb de memória dedicada isso é pouco para uma aplicação desse porte que roda varios frameworks?
já pesquisei e li que o spring + hibernate gasta muita memória mesmo li até sobre o -XX:MaxPermSize=256m porém em ambiente de desenvolvimento nenhum PC teve qualquer configuração alterada para aumentar a memório da JVM ou tomcat e sempre funcionou já aumentei o plano para ter 256mb de memória dedicada mas o erro persiste já usei o JProfiler para procurar leaks de memória mas não acredito que existam.

Resumindo: 256mb de memória dedicada é pouco para uma aplicação assim com tantos frameworks? Deveria eu contratar um plano com mais memória ou existe alguma biblioteca que gerencia o consumo de memória para mim?

Desde já agradeço

8 Respostas

lindberg713

Cara, teste localmente na sua máquina setando o XX:MaxPermSize para 128. Ai vc faz os testes e verifica na sua propria máquina se ocorre o problema. Se ocorrer vc aumenta para 256 e verifica, se ocorrer, ai vc aumenta pra ver em quanto de memória que resolve. Se aumentar um pouco mais e resolver, ai vc aumentar o seu plano la. 256 não sei se ta o suficiente. Testa com 512 pra ter certeza. Quanto a uma lib que gerencie isto para vc, desconheço.

DarthCego

Ola amigo

incrivelmente eu testei localmente com

-XX:MaxPermSize=64m

na JVM e funcionou so deu erro de permGen quando setei 32mb dai fui olhar o catalina.sh do servidor e esta assim

JAVA_OPTS="-Xms32m -Xmx256m -XX:MaxPermSize=96m" se eu alterar o MaxPermSize no tomcat será que surtira algum efeito? pois localmente nao há nenhuma configuração diferente no meu tomcat

Obrigado

AGAraujo

Estou tento o mesmo problema… sendo que antes de eu atualizar o Spring para 3.1 e mudar a implementação de JPA para Hibernate tudo era tranquilo.
Descobriu algo?

gnucleber

Ola amigos,

To tentando montar uma aplicação com JSF 2.1 + Hibernate e Spring Security, pelo que vi no tópico vocês ja conseguiram isso. Estou seguindo o livro da novatec Programação pra WEB. O livro monta um DataSource JNDI para o Spring Security e Hiberante acessarem o Mysql fiz e já refiz os passos e sempre apresenta a seguinte mensagem de erro pelo netbeans 7.1.1:
INFO: Server startup in 11919 ms
10/06/2012 15:09:31 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
GRAVE: The web application [/Financeiro] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it. This is very likely to create a memory leak.
10/06/2012 15:09:32 org.apache.catalina.startup.HostConfig checkResources
INFO: Undeploying context [/Financeiro]
10/06/2012 15:09:32 org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor Financeiro.xml from /Users/cleber/.netbeans/7.1.1/apache-tomcat-7.0.22.0_base/conf/Catalina/localhost

Meu context.xml onde cria o datasource:

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/Financeiro"
 reloadable="true">
     <Resource auth="Container"
     driverClassName="com.mysql.jdbc.Driver" 
     maxActive="100"
     maxIdle="30" 
     maxWait="10000" 
     name="jdbc/FinanceiroDB"
     password="adm" 
     type="javax.sql.DataSource" 
     url="jdbc:mysql://localhost:3306/financeiro?autoReconnect=true"
     username="root"/>    
 </Context>
O meu applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

	<bean id="financeiroDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiName">
			<value>java:comp/env/jdbc/FinanceiroDB</value>
		</property>
	</bean> 	
</beans>
O meu applicationConext-security.xml
<?xml version="1.0" encoding="UTF-8"?>
<b:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:b="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd">
	<http>

		<intercept-url pattern="/admin/**" access="ROLE_ADMINISTRADOR" />
		<intercept-url pattern="/restrito/**" access="ROLE_USUARIO" />
		<form-login login-page="/publico/login.jsf"
			always-use-default-target="true" default-target-url="/restrito/principal.jsf"
			authentication-failure-url="/publico/login.jsf?login_error=1" />
		<logout/>
		<remember-me />
	</http>

	<authentication-manager>
		<authentication-provider>
			<jdbc-user-service data-source-ref="financeiroDataSource"
				authorities-by-username-query="SELECT login, permissao FROM usuario WHERE login = ?"
				users-by-username-query="SELECT login, senha, ativo FROM usuario WHERE login = ?" />
		</authentication-provider>
	</authentication-manager>
</b:beans>
Meu web.xml:
<!-- Spring Security -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/applicationContext.xml
			/WEB-INF/applicationContext-security.xml
		</param-value>
	</context-param>
     <filter>
		<filter-name>springSecurityFilterChain</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>springSecurityFilterChain</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>   
        
        

    <resource-ref>
		<description>DataSource FinaceiroDB</description>
		<res-ref-name>jdbc/FinanceiroDB</res-ref-name>
		<res-type>javax.sql.DataSource</res-type>
		<res-auth>Container</res-auth>
	</resource-ref>

Amigos agradeço qualquer ajuda ou dica pois já tem varios dias que quebro cabeça com esse código.

forte abraço.

AGAraujo

O que está dizendo ai é que o “contexto” que configurou possivelmente não foi carregado, pois o caminho /Financeiro não está conhecido.
O por quê de não ter sido carregado é outra historia! Pode ter sido erro de parametros, caminho incorreto do arquivo de contexto, etc…
O melhor a fazer é verificar o carregamento…

Ari

H

gnucleber,

da uma olhada nos logs do tomcat, eu tava tendo bastante destes erros e por incrível que pareça
uma daz vezes foi erro de um mapeamento do hibernate*, não se confie muito destes erros ae, eu
acho melhor olhar direto nos logs.

Caso vc esteja rodando direto do Netbeans, copia o projeto e roda dirteo pelo tomcat e acompanha nos logs,
eu ja tive esses erros dos infernos, mas foram vários e vou ter que olhar melhor aqui pra te ajudar.

*Alterei

gnucleber

Haziel:
gnucleber,

da uma olhada nos logs do tomcat, eu tava tendo bastante destes erros e por incrível que pareça
uma daz vezes foi erro de um mapeamento do tomcat, não se confie muito destes erros ae, eu
acho melhor olhar direto nos logs.

Caso vc esteja rodando direto do Netbeans, copia o projeto e roda dirteo pelo tomcat e acompanha nos logs,
eu ja tive esses erros dos infernos, mas foram vários e vou ter que olhar melhor aqui pra te ajudar.

Ola Haziel, realmente você tinha razão cara. Peguei a versão mais nova do netbeans (7.1.2) coloquei a aplicação e rodei o tomcat e fui acessar direto pelo browser ao invez de mandar executar pelo NetBeans e ta tudo normal! Vale pela dica :wink:

H

É um parto, toda alteração nas classes tenho que ficar parando o tamcat e copiando do netbeans mas
é a única maneira que deu pra mim. Que bom que ta tudo ok. Tbm estou usando este livro, é muito bom.

Criado 9 de março de 2012
Ultima resposta 14 de jun. de 2012
Respostas 8
Participantes 5