Problema Componente java.lang.OutOfMemory[RESOLVIDO]

Bom dia rapaziada…to enfrentando o seguinte problema em um servidor de produção com componentes agendado no spring…esta dando varios estouros de memoria
estou usando o c3p0 como pool de conexões e tenho 2 componentes rodando… um pra envio de email…e uma que realiza um update apenas…alguem com mais experiencia poderia me dar alguma dica de como achar a fonte do problema ou o que possivelmente podeira ser pra que isso não ocorra mais??

abaixo segue meu catalina.out dos ultimos 2 dias…agradeço qualquer ajuda…


Exception in thread "com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1" java.lang.OutOfMemoryError: Java heap space
	at oracle.jdbc.driver.OracleStatement.prepareAccessors(OracleStatement.java:819)
	at oracle.jdbc.driver.OracleStatement.execute_maybe_describe(OracleStatement.java:972)
	at oracle.jdbc.driver.T4CPreparedStatement.execute_maybe_describe(T4CPreparedStatement.java:535)
	at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1051)
	at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:2984)
	at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3026)
	at oracle.jdbc.OracleDatabaseMetaData.getTables(OracleDatabaseMetaData.java:2323)
	at com.mchange.v2.c3p0.impl.DefaultConnectionTester.activeCheckConnectionNoQuery(DefaultConnectionTester.java:185)
	at com.mchange.v2.c3p0.impl.DefaultConnectionTester.activeCheckConnection(DefaultConnectionTester.java:62)
	at com.mchange.v2.c3p0.AbstractConnectionTester.activeCheckConnection(AbstractConnectionTester.java:67)
	at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.testPooledConnection(C3P0PooledConnectionPool.java:368)
	at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.refurbishIdleResource(C3P0PooledConnectionPool.java:310)
	at com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask.run(BasicResourcePool.java:1999)
	at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
Warning: Caught exception attempting to use JAXP to create a W3C DOM document
Warning: Exception was: java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
	at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.<init>(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.dtd.XMLNSDTDValidator.<init>(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.<init>(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XIncludeAwareParserConfiguration.<init>(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XIncludeAwareParserConfiguration.<init>(Unknown Source)
Exception in thread "Timer-34" Exception in thread "Timer-11" Exception in thread "Timer-26" Exception in thread "com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2" Exception in thread "com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2" 	at sun.reflect.GeneratedConstructorAccessor35.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
	at java.lang.Class.newInstance0(Class.java:372)
	at java.lang.Class.newInstance(Class.java:325)
	at com.sun.org.apache.xerces.internal.parsers.ObjectFactory.newInstance(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.ObjectFactory.createObject(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.ObjectFactory.createObject(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.DOMParser.<init>(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.DOMParser.<init>(Unknown Source)
	at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.<init>(Unknown Source)
	at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl.newDocumentBuilder(Unknown Source)
	at org.dom4j.io.JAXPHelper.createDocument(JAXPHelper.java:61)
	at org.dom4j.io.DOMWriter.createDomDocumentViaJAXP(DOMWriter.java:315)
	at org.dom4j.io.DOMWriter.createDomDocument(DOMWriter.java:294)
	at org.dom4j.io.DOMWriter.write(DOMWriter.java:128)
	at org.hibernate.envers.configuration.EntitiesConfigurator.configure(EntitiesConfigurator.java:115)
	at org.hibernate.envers.configuration.AuditConfiguration.<init>(AuditConfiguration.java:86)
	at org.hibernate.envers.configuration.AuditConfiguration.getFor(AuditConfiguration.java:99)
	at org.hibernate.envers.event.AuditEventListener.initialize(AuditEventListener.java:315)
	at org.hibernate.event.EventListeners$1.processListener(EventListeners.java:198)
	at org.hibernate.event.EventListeners.processListeners(EventListeners.java:181)
	at org.hibernate.event.EventListeners.initializeListeners(EventListeners.java:194)
	at org.hibernate.cfg.Configuration.getInitializedEventListeners(Configuration.java:1396)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1385)
	at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
	at br.com.webtia.contrato.scheduler.EmailSendTask.run(EmailSendTask.java:40)
Exception in thread "com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1" Exception in thread "com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1" Exception in thread "com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0" java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
	at java.util.LinkedList.clone(LinkedList.java:853)
	at com.mchange.v2.resourcepool.BasicResourcePool.cloneOfUnused(BasicResourcePool.java:1661)
	at com.mchange.v2.resourcepool.BasicResourcePool.cullExpired(BasicResourcePool.java:1450)
	at com.mchange.v2.resourcepool.BasicResourcePool.access$1900(BasicResourcePool.java:32)
	at com.mchange.v2.resourcepool.BasicResourcePool$CullTask.run(BasicResourcePool.java:1937)
	at java.util.TimerThread.mainLoop(Timer.java:534)
	at java.util.TimerThread.run(Timer.java:484)
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOfRange(Arrays.java:3221)
	at java.lang.String.<init>(String.java:233)
	at java.lang.StringBuffer.toString(StringBuffer.java:602)
	at oracle.net.resolver.AddrResolution.resolveSimple(Unknown Source)
	at oracle.net.resolver.AddrResolution.resolveAndExecute(Unknown Source)
	at oracle.net.ns.NSProtocol.establishConnection(Unknown Source)
	at oracle.net.ns.NSProtocol.connect(Unknown Source)
	at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:706)
	at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:228)
	at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:361)
	at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:151)
	at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
	at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:595)
	at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:134)
	at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182)
	at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)
	at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137)
	at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)
	at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
	at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
	at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
java.lang.OutOfMemoryError: Java heap space
17:58:03,895  WARN ThreadPoolAsynchronousRunner:608 - com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@6aee8001 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
17:58:56,370  WARN ThreadPoolAsynchronousRunner:624 - com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@6aee8001 -- APPARENT DEADLOCK!!! Complete Status: 
	Managed Threads: 3
	Active Threads: 3
	Active Tasks: 
		com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@6c730199 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
		com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@726e1b6e (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
		com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1acb0d73 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
	Pending Tasks: 
		com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@8e006c3
Pool thread stack traces:
	Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main]
		com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1026)
		com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
		com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
		com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
	Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
		com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1026)
		com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
		com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
		com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
	Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main]
		com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1026)
		com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
		com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
		com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547
Exception in thread "Timer-8" java.lang.OutOfMemoryError: Java heap space
00:02:35,864 ERROR TaskUtils$LoggingErrorHandler:95 - Unexpected error occurred in scheduled task.
java.lang.OutOfMemoryError: Java heap space

Está estourando a memória sem motivo aparente…

Spring é um framework ou biblioteca brasileiro? :shock: Muitos aqui têm o hábito de postar aqui porque a galera do Vraptor é mais ativa nas respostas, porém acima de tudo deve-se respeitar as normas do fórum e postar as coisas nos seus devidos lugares.

Spring é um framework ou biblioteca brasileiro? :shock: Muitos aqui têm o hábito de postar aqui porque a galera do Vraptor é mais ativa nas respostas, porém acima de tudo deve-se respeitar as normas do fórum e postar as coisas nos seus devidos lugares.[/quote]

Bom eu só postei aki porque pelo que sei a implementação padrão do vraptor está usando o spring…e pode ser que o “spring” não seja o culpado dos estouros…não tenho experiencia pra dizer que a culpa é de 1 ou outro framework…apenas pedindo ajuda de como saber isso…o componente é vraptor…eu peguei no livro de receitas do site …entao tudo me leva a crer que aqui que devo pedir ajuda pois senao não estaria postando…

peguei no link
http://vraptor.caelum.com.br/cookbook/job-scheduling-com-vraptor3-e-spring/

package br.com.webtia.contrato.scheduler;

import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.joda.time.DateTime;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.support.CronTrigger;

import br.com.caelum.vraptor.ioc.ApplicationScoped;
import br.com.caelum.vraptor.ioc.Component;
import br.com.webtia.contrato.daos.ContratoDao;
import br.com.webtia.contrato.interfaces.ApplicationTask;

@Component
@ApplicationScoped
public class RescindeContratoTask implements ApplicationTask {
	static Logger logger = Logger.getLogger(RescindeContratoTask.class); 
	public RescindeContratoTask(TaskScheduler scheduler) {
    	this.schedule(scheduler);
    }
    public void schedule(TaskScheduler scheduler) {
        scheduler.schedule(this, new CronTrigger("1 0 0 * * *"));
    }
	@Override
	public void run() {
		//Rescisão de contrato
		long start = System.currentTimeMillis();
		Configuration conf = new AnnotationConfiguration().configure();
		SessionFactory factory = conf.buildSessionFactory();
		Session session = factory.openSession();
		Transaction transaction = null;
		try {
			transaction = session.beginTransaction();
			ContratoDao daoContrato = new ContratoDao(session,null,null);
			daoContrato.rescindeContratoScheduled();
			transaction.commit();
		} finally {
			if (transaction != null && transaction.isActive()) {
				transaction.rollback();
			}
			session.close();
		}
		long end = System.currentTimeMillis();
		logger.info("Task RescindeContratoTask executada em =>"+(end-start)+" ms - Ultima execução =>"+new DateTime());
	}
}

Esse é o componente que estou utilizando seguindo a implementação do link do livro de receitas…

Agradeço qualquer ajuda…

Essa exceção estoura em tantos pontos diferentes que é até difícil de saber direito o que está acontecendo… Veja:

[code]Exception in thread “com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1” java.lang.OutOfMemoryError: Java heap space
at oracle.jdbc.driver.OracleStatement.prepareAccessors(OracleStatement.java:819)

Warning: Exception was: java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.(Unknown Source)

java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
at java.util.LinkedList.clone(LinkedList.java:853)

java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Arrays.java:3221) [/code]

Ou seja, um aconteceu acessando o BD, outro fazendo parse de XML, outro clonando uma lista e outro copiando um array. O que dá a entender é que a carga do servidor de produção está um tantinho mais alta do que onde foi desenvolvido e, teoricamente, um aumento na memória da JVM deve resolver o problema. Como estão configurados os parâmetros de memória?

[]´s

[quote=asaudate]Essa exceção estoura em tantos pontos diferentes que é até difícil de saber direito o que está acontecendo… Veja:

[code]Exception in thread “com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1” java.lang.OutOfMemoryError: Java heap space
at oracle.jdbc.driver.OracleStatement.prepareAccessors(OracleStatement.java:819)

Warning: Exception was: java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.(Unknown Source)

java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
at java.util.LinkedList.clone(LinkedList.java:853)

java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Arrays.java:3221) [/code]

Ou seja, um aconteceu acessando o BD, outro fazendo parse de XML, outro clonando uma lista e outro copiando um array. O que dá a entender é que a carga do servidor de produção está um tantinho mais alta do que onde foi desenvolvido e, teoricamente, um aumento na memória da JVM deve resolver o problema. Como estão configurados os parâmetros de memória?

[]´s[/quote]

Entao na homologação aki que utilizo minha maquina é um intel core i5 com 4gbRAM …nao coloco uma configuração pradrao no tomcat…

no servidor de produção é ma maquina virtual onde roda o servidor tomcat dentro com memoria virtual de 1gb apenas que na verdade é compartilhada de um servidor real…que nao sei a especificação…talve esteja ai o problema…sem uma configuração padrão tambem de memória …

quando nao se define nada em JAVA_OPTS no start do servidor a jvm nao se vira com o que tem???Seria ideal configurar a variavel JAVA_OPTS com Xmx e Xms -XX:PermSize???
Pra 1 giga de ram qual seria o ideal?

O local onde ocorre o estouro de memória não é relevante.
O problema é que a memória está sendo consumida e ocasionando falta.

Um dos dois (ou os dois) motivos:
1- A configuração de memória está mal dimensionada.
2- A aplicação não libera os recursos utilizados (connection, resultset, statement, jms, etc)

Vamos supor que o sistema fica dois dias rodando e no terceiro dá falta de memória.

Se neste terceiro dia, a carga de uso foi como nos outros dois dias, então a probabilidade de estar ocorrendo o segundo item é maior.
Se neste terceiro dia, a carga foi anormal e muito maior que nos outros dois dias, então é possível que seja 1.

Se você aumenta a memória da JVM e o problema passa a acontecer no 5o dia ao invés do 3o, você só postergou o problema.

Eu apostaria mais no item 2.

boneazul, desculpe, no post não citava que estava usando vraptor, por isso minha indagação. :thumbup:

Mas vamos lá… o tomcat não é lá um bom container para coisas muito críticas. Um dos graves problemas dele é de ficar objetos presos em memória, principalmente se tratando de atributos estáticos. Não lembro bem o link desses problemas, mas se você fizer uma pesquisa por tomcat memory leak você vai encontrar algumas coisas interessantes. Não faço isso porque estou postando do celular, e é um “pouco tenso” fazer pesquisar em uma tela pequena.

Uma coisa que você pode fazer é verificar se o causados do out-of-memory é esse componente e tentar através de um profiler entender o que está causando o out-of-memory.

Não importa se você tem um 1pb de memória, a VM nunca vai usar isso. O máximo que uma vm em intel32 chega é 1.7G por instância (preciso procurar as fontes disso para confirmar).

Tente algo como abaixo. Lembrando que se você está em algum servidor com missão critica, você precisa fazer um ajuste mais fino nesses parametros, além de iniciar com a opção -server (o padrão é -client). Sai um artigo na Java Magazine há uns 6 meses atrás sobre esses parametros todos da JVM.
-Xms600m -Xmx1024m

Ele está usando Hibernate com Spring, e ambos tomam os cuidados de liberar esse tipo de recurso (quanto aos recursos de BD). Quanto aos recursos de JMS, duvido muitíssimo que seja, porque afinal, ele está usando um Tomcat. Não me ocorre mais nenhum tipo de recurso, e vc?

[]´s

Post duplicado.

To muito cismado com a factory desse scheduler que peguei…

[code]
package br.com.webtia.contrato.scheduler;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.apache.log4j.Logger;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

import br.com.caelum.vraptor.ioc.ApplicationScoped;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.ComponentFactory;

@Component
@ApplicationScoped
public class TaskSchedulerFactory implements ComponentFactory {
private static Logger logger = Logger.getLogger(TaskSchedulerFactory.class);
private ThreadPoolTaskScheduler scheduler;

@PostConstruct
public void create() {
	logger.info("Iniciando nova threadpool scheduler");
    scheduler = new ThreadPoolTaskScheduler();
    scheduler.initialize();
}

public TaskScheduler getInstance() {
    return scheduler;
}

@PreDestroy
public void destroy() {
	logger.info("Destruindo threadpool scheduler");
    scheduler.destroy();
}

}[/code]

Ele sempre inicia o scheduler mais ele nunca destroy…nao entendi muito bem o pq??

A rotina de email roda de 5 em 5 minutos…levando em conta que o servidor apresenta esse estouro geralmente no fim do dia é provavel isso estar gerando problema,ou nao,em todo caso baixei o jprofiler pra fazer testes mais tarde…

Problema de session do hibernate num deve ser pq utilizo o custom provider ja implementado do vraptor e os componentes que fiz abre e fecha o recurso corretamente tambem…

só esse scheduler que nao entra nunca nesse logger falando que ele foi destruido…ele teria ou nao que ser destruido??

obrigado por enquanto pelas respostas…

Bom, aí depende… vc diz que ele foi criado mas não foi destruído, mas foi criado QUANTAS vezes? Notei que ele tem o escopo de aplicação , então, é normal que ele não tenha sido destruído. Só não é normal se ele for criado várias vezes…

[]´s

[quote=asaudate]Bom, aí depende… vc diz que ele foi criado mas não foi destruído, mas foi criado QUANTAS vezes? Notei que ele tem o escopo de aplicação , então, é normal que ele não tenha sido destruído. Só não é normal se ele for criado várias vezes…
[]´s[/quote]

é o log so aponta uma vez pra criação …ele não é criado duas vezes…caramba viu…ta foda…nao tem mais onde procurar que não esteja fechando recurso…vo dar uma olhada no jprofiler hoje a noite e subir pra ver o q ta pegando…amanha posto as conclusões…abraços…

Achei estranho algumas coisas… porque você sempre cria uma factory do hibernate na hora que usa o scheduler? Você não pode usar os componentes próprios do vraptor para isso?

  • Não sei se é só comigo que acesso pelo celular, mas esse log enorme que você colocou quase trava meu navegador.

[quote=garcia-jj]Achei estranho algumas coisas… porque você sempre cria uma factory do hibernate na hora que usa o scheduler? Você não pode usar os componentes próprios do vraptor para isso?

  • Não sei se é só comigo que acesso pelo celular, mas esse log enorme que você colocou quase trava meu navegador.[/quote]

é meu navegador tb da de travar mais isso é devido ao syntaxhighliter que demora pra pintar as cores das tags code…ja diminui o tamanho do log com trechos que realmente interessam…

Como usaria “os componentes” do vraptor pra isso??Poderia postar um trecho do código que voce acha ideal???
Bom eu uso a factory do hibernate pra poder usar o dao que tem como dependencia a session do hibernate ja que nao pude injetar o dao no construtor ja que o componente é applicationscoped e a injecao de dependencia parece nao funcionar ja que o dao esta em escopo de request…mas teria algum problema invocar essa factory ai???

Bom vamos aos dados do profiler…bom realmente é a scheduler que ta comendo a memoria e não está liberando recurso em algum ponto…vo colocar algumas figuras dos print do jprofiler pra voces verem a diferença e ve se conseguer me ajudar com isso …bom o teste básico que eu fiz foi

1 - Desligar todos scheduler e ver a carga do sistema por 2:30 segundos …

Pelo que analisei nos graficos depois que a aplicação sobe ele sempre mantem se estavel…entre 70 e 90mb de memoria…e load de cpu muito baixo…
O numero de threads tambem em torno de 22 sendo que uso 10 pra uso do pool de conexões do c3p0 ->(por default ele usa 3) e o resto da main,etc…

Ou seja super leve …

2 - Agora vo ligar 1 scheduler e colocar ele pra rodar de 10 em 10 segundos com 1:30 segundos…

Pelo que analisei nos graficos depois que a aplicação sobe o aumento de memoria é sempre crescente quase 400 mega em comparação com os 70 alem do load da cpu ficar altissimo…e nunca se mantem…
O numero de threads subiu muito tambem para 128 mais ou menos…

Não é possivel que esteja custando tanto uma simples tarefa dessa…






[quote=boneazul]Bom vamos aos dados do profiler…bom realmente é a scheduler que ta comendo a memoria e não está liberando recurso em algum ponto…vo colocar algumas figuras dos print do jprofiler pra voces verem a diferença e ve se conseguer me ajudar com isso …bom o teste básico que eu fiz foi

1 - Desligar todos scheduler e ver a carga do sistema por 1:30 segundos …

Pelo que analisei nos graficos depois que a aplicação sobe ele sempre mantem se estavel…entre 70 e 90mb de memoria…
O numero de threads tambem em torno de 22 sendo que uso 10 pra uso do pool de conexões do c3p0 ->(por default ele usa 3) e o resto da main,etc…

Ou seja super leve …

2 - Agora vo ligar 1 scheduler e colocar ele pra rodar de 10 em 10 segundos com o mesmo tempo…

Pelo que analisei nos graficos depois que a aplicação sobe o aumento de memoria é sempre crescente e nunca se mantem…
O numero de threads subiu muito tambem para 128 mais ou menos…

[/quote]

e o ultimo grafico das threads …parece que a cada chamada que faz do recurso ou seja o scheduler é executado …o c3p0 chama 10 threads pra fazer o servio do pool eles não são liberados ai passa 10 segundos elel chama mais 10 ai ja fica 20 pendurada e por ai vai…ai num há jvm que de conta…kkkkk

Alguma ideia ??? num queria partira pra um cron da vida rodando java…ja que o spring tem esse recurso…e deus abençoe o jprofiler…


Meu caro,

Poste alguns códigos principais da sua aplicação, onde utiliza recursos de banco, fila, datasources, poolm etc. Posta também alguns arquivos de configuração xml relacionados a recursos

Ainda mantenho minha aposta de que em algum ponto sua app não está liberando recursos. O fato de utilizar frameworks como hibernate, spring, etc … não elimina a possibilidade de estar causando leak.

[quote=CarvalR2]Meu caro,

Poste alguns códigos principais da sua aplicação, onde utiliza recursos de banco, fila, datasources, poolm etc. Posta também alguns arquivos de configuração xml relacionados a recursos

Ainda mantenho minha aposta de que em algum ponto sua app não está liberando recursos. O fato de utilizar frameworks como hibernate, spring, etc … não elimina a possibilidade de estar causando leak.

[/quote]

Eu achei o ponto do leak…é ligado ao scheduler quando tiro o scheduler de funcionamento não há leak algum…é algum ponto nesse scheduler que não libera recurso…eu resolvi de uma maneira menos portavel pois tava meio urgente isso…usando o cron chamando uma url por wget …coisa que não queria ter feito…

bom vai la o código da implementação do scheduler…

Interface task

package br.com.webtia.contrato.interfaces;

import org.springframework.scheduling.TaskScheduler;

public interface Task extends Runnable {
    void schedule(TaskScheduler scheduler);
}

Interface application task

package br.com.webtia.contrato.interfaces;

public interface ApplicationTask extends Task {
}

Factory de schedulers

package br.com.webtia.contrato.scheduler;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.apache.log4j.Logger;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

import br.com.caelum.vraptor.ioc.ApplicationScoped;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.ComponentFactory;

@Component
@ApplicationScoped
public class TaskSchedulerFactory implements ComponentFactory<TaskScheduler> {
	private static Logger logger = Logger.getLogger(TaskSchedulerFactory.class);
    private ThreadPoolTaskScheduler scheduler;
    
    @PostConstruct
    public void create() {
    	logger.info("Iniciando nova threadpool scheduler");
        scheduler = new ThreadPoolTaskScheduler();
        scheduler.initialize();
    }
    
    public TaskScheduler getInstance() {
        return scheduler;
    }
    
    @PreDestroy
    public void destroy() {
    	logger.info("Destruindo threadpool scheduler");
        scheduler.destroy();
    }
    
}
package br.com.webtia.contrato.scheduler;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Calendar;
import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.joda.time.DateTime;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.support.CronTrigger;

import br.com.caelum.vraptor.ioc.ApplicationScoped;
import br.com.caelum.vraptor.ioc.Component;
import br.com.webtia.contrato.daos.EmailPanelDao;
import br.com.webtia.contrato.interfaces.ApplicationTask;
import br.com.webtia.contrato.models.EmailPanel;
import br.com.webtia.contrato.util.SendMail;

@Component
@ApplicationScoped
public class EmailSendTask implements ApplicationTask {
	static Logger logger = Logger.getLogger(EmailSendTask.class); 
	public EmailSendTask(TaskScheduler scheduler) {
    	this.schedule(scheduler);
    }
    public void schedule(TaskScheduler scheduler) {
    	scheduler.schedule(this, new CronTrigger("0/10 * * * * *"));
    }
	@Override
	public void run() {
		
		//Disparo de email
		long start = System.currentTimeMillis();
		Configuration conf = new AnnotationConfiguration().configure();
		SessionFactory factory = conf.buildSessionFactory();
		Session session = factory.openSession();
		Transaction transaction = null;
		try {
			transaction = session.beginTransaction();
			EmailPanelDao daoEmailPanel = new EmailPanelDao(session);
			List<EmailPanel> emails  = daoEmailPanel.listAllNotSended();
			for(EmailPanel email : emails){
				try {
					SendMail.sendMail(email.getTo(),email.getFrom(), email.getSubject(), email.getMessage());
					email.setSended('S');
					email.setSendeddate(Calendar.getInstance().getTime());
					email.setProblem("");
				} catch(Exception e) {
					StringWriter w = new StringWriter();
					email.setSended('N');
					e.printStackTrace(new PrintWriter(w));
					email.setProblem(w.toString());
				}
				daoEmailPanel.update(email);
			}
			
			transaction.commit();
		} finally {
			if (transaction != null && transaction.isActive()) {
				transaction.rollback();
			}
			session.close();
		}
		long end = System.currentTimeMillis();
		logger.info("Task EmailSendTask executada em =>"+(end-start)+" ms - Ultima execução =>"+new DateTime());
	}
}

O leak esta nesse meio ai…pq quando desligo essa ultima classe o servidor nao é sobrecarregado se voce ver no profile…algum ponto nesse trechos estao comendo recurso…
deve ser a ligação entre a extensão de runnable e o ponto da criacao da session do hibernate e o c3p0 algo nesse sentido…nao tenho muuita experiencia pra saber exato o ponto que deveria liberar e nao libera…

Boneazul, Eu fiz um teste com o job scheduling conforme o cookbook só que utilizei, conforme o sugerido, uma classe PrototypedDao (com @PrototypeScoped)

Talvez fosse interessante testar utilizando essa classe.

No meu teste a classe ficou desta forma (como exemplo):

@Component
@PrototypeScoped
public class PrototypeDao {
	
	private Session session;
	
	public PrototypeDao(SessionFactory sessionFactory) {
		this.session = sessionFactory.openSession();
	}
	public void adiciona(Divisao d) { 
		this.session.save(d); 
	}
	protected Session getSession() {
		return session;
	}
}

[quote=Lagaffe]Boneazul, Eu fiz um teste com o job scheduling conforme o cookbook só que utilizei, conforme o sugerido, uma classe PrototypedDao (com @PrototypeScoped)

Talvez fosse interessante testar utilizando essa classe.

No meu teste a classe ficou desta forma (como exemplo):

@Component
@PrototypeScoped
public class PrototypeDao {
	
	private Session session;
	
	public PrototypeDao(SessionFactory sessionFactory) {
		this.session = sessionFactory.openSession();
	}
	public void adiciona(Divisao d) { 
		this.session.save(d); 
	}
	protected Session getSession() {
		return session;
	}
}

[/quote]

é nao pensei em fazer esse teste pra ver como se comporta …

entao mas onde eu usaria esse prototype scoped??
poderia me dar um exemplo completo??ou pegar esse meu codigo e modificar a parte relevante…

obrigado por enquanto a todos que estão ajudando…