Java.lang.StackOverflowError: o que pode causar?

15 respostas
P

Fala amigos :slight_smile:

To com um bug aqui e preciso descobrir o motivo, mas está flórida pq não sei o que pode ocasionar este estouro na minha camada com o BD.

[Nova entrada do log] 	    at oracle.toplink.expressions.Expression.shallowClone(Expression.java:3350)
[Nova entrada do log] 	    at oracle.toplink.expressions.Expression.registerIn(Expression.java:3167)
[Nova entrada do log] 	    at oracle.toplink.expressions.Expression.copiedVersionFrom(Expression.java:811)
[Nova entrada do log] 	    at oracle.toplink.internal.expressions.CompoundExpression.postCopyIn(CompoundExpression.java:202)
[Nova entrada do log] 	    at oracle.toplink.expressions.Expression.registerIn(Expression.java:3169)
[Nova entrada do log] 	    at oracle.toplink.expressions.Expression.copiedVersionFrom(Expression.java:811)
[Nova entrada do log] 	    at oracle.toplink.internal.expressions.CompoundExpression.postCopyIn(CompoundExpression.java:202)
[Nova entrada do log] 	    at oracle.toplink.expressions.Expression.registerIn(Expression.java:3169)
[Nova entrada do log] 	    at oracle.toplink.expressions.Expression.copiedVersionFrom(Expression.java:811)
[Nova entrada do log] 	    at oracle.toplink.internal.expressions.CompoundExpression.postCopyIn(CompoundExpression.java:202)

Alguém pode me dar uma luz?

Obrigado

15 Respostas

D

talvez uma recursão que não acabou, talvez um laço infinito… cadê o código? :smiley:

P

Ele não faz um laço infinito pq aqui no ambiente de desenvolvimento funciona, o problema é quando vai para o ambiente do cliente. Lá é bem lerdo as coisas, não sei se isso tem algo a ver :S

J

a stack é memória reservada aos programas, para operações de eventos de hardware. Se vc está recebendo esse tipo de erro(stack overflow), é o software que está consumindo memória demais.

D

tenta aumentar a memória nos arquivos de configuração :smiley:

V

Estranho que a recursão ocorre dentro do toplink.

Primeira coisa a tentar, vê se a versão do toplink é a mais atual.

P

tenta setar a memoria a ser utilizada: java -Xmx512m -jar arquivo.jar

[]'s

R

Geralmente stack overflow ocorre por causa de recursão infinita. Nesse caso aumentar a memória ja JVM não resolve muita coisa. Além de que eu acho que só é possível ajustar o tamanho do heap. O que pode ocasionar esse comportamento é alguma entrada que você não testou no ambiente de desenvolvimento mas que está no cliente.

P

nem sempre… ainda mais da forma como ele disse q sao as maquinas dos usuarios!!!

P

Aqui foi testada e a única execução desse processamento é uma query de select com parâmetros fixos, por isso foi testado aqui. A execução é a mesma. O problema lá é o ambiente, pra vc ter idéia, eu não consigo fazer deploy 2x sem antes matar a instância do OC4J.

J

É a pilha do windows que não suporta mais de 8 megas. Tem que rever o código. Alguma variável alocada na stack, tá muito grande. Esse é o grande problema de ter memória gerenciada automaticamente.

P

Que zuado…

Eu fiz uma alteração de processamento pq temos um fluxo, que pode retornar 40 mil registros e pra cada registro, estava sendo feita uma busca em outras tabelas. Mudei a query para realizar tudo de uma vez.

Vamos ver o que acontece e eu posto aqui

Valeu pela ajuda :smiley:

E

padcoe:
Que zuado…

Eu fiz uma alteração de processamento pq temos um fluxo, que pode retornar 40 mil registros e pra cada registro, estava sendo feita uma busca em outras tabelas. Mudei a query para realizar tudo de uma vez.

Vamos ver o que acontece e eu posto aqui

Valeu pela ajuda :D

Pois é, provavelmente vc esta executando uma query q retorna muita coisa, e vai tudo no ResultSet para a memória. Isto é muito mau! Vc tem que usar paginação! Não faz sentido uma query retornar mais que 1.000 registos, pois ninguem vai analisar mais do que 1.000 registos de uma vez, e mesmo assim é muito.

O que se deve fazer também é configurar na base de dados para limitar as queries para retornar no máximo 1000 registros.

Assim vc garante que nunca vai ter este probelma independente do tamanho das tabelas.

P
Ola, sei que o tópico é antigo mas estou com o mesmo problema =( Alguém poderia me ajudar a encontar o erro no meu código? Meu código é o seguinte:
public int achaMaior(int vetor[],int maior){
		return 	maiorValorDoVetor(vetor,maior);
	}

	private int maiorValorDoVetor(int[] vetor,int maior)
	{
		//vetor{3,4,2,6,7,8} 
		int meio=vetor.length/2;
		if(vetor.length-1==1)
		return vetor[0];
		
		if(vetor[meio]<maior)
			return maiorValorDoVetor(vetor, vetor[meio+1]);
		else 
			return maiorValorDoVetor(vetor, vetor[meio-1]);//da este erro nesta linha
		}
Ah e o que eu estou tentando fazer é o seguinte:escrever uma função recursiva que determine o maior valor de um vetor usando o processo de bisseção, isto é, o vetor é dividido ao meio em dois subvetores e calcula-se o maior de cada um deles; o maior valor do vetor será o maior entre os dois valores apurados.

Obrigada pela ajuda

E

O valor da variável meio vai ser sempre igual em todas as interações da função recursiva. Então quando chega no if sempre vai ir a posição seguinte e a anterior referente ao meio, mas este meio nunca vai mudar, por que o vetor.length é constante.

Talvez o erro seja por que o calculo meio - 1 esteja dando menor que 0!

O melhor é vc rodar isto em debug e ver em cada interação qual o valor das variáveis ou jogar prints.

P

consegui resolver!!!
Obrigada pela ajuda :wink:
tinhas razão so mudei o valor da variavel meio e criei uma outra variavel para representar o final do vetor!

Criado 4 de março de 2009
Ultima resposta 20 de jun. de 2011
Respostas 15
Participantes 8